microSD card wearing out after a few weeks

I'm logging a couple hundred bytes of temperature data to a microSD card every 10 minutes. The data is written to a revolving set of ~400 log files, not more than 100k bytes total. I've tried various sizes and manufacturers of cards, including SanDisk (2GB). I'm reading from the card every 10 seconds or so. Why are these cards all wearing out after weeks of runtime (two months maximum)? I use the card as formatted by the manufacturer. There is no unusual magnetism in environment, etc. Shouldn't the wear-leveling on these cards extend their life beyond a few thousand write cycles? When the card wears out it simply stops storing the data. Switching to a new card resolves the issue. Could the Ethernet Shield be bad?

show the sketch

I’m just calling log() every 10 minutes:

 #include <Fat16.h>

 int nextFileToWrite = 0;
 const char TL_FNAME_TEMPLATE[] PROGMEM = { "TL_%d.csv" };


   Fat16 sf;
   char logname[12], format[16];
   strcpy_P(format, TL_FNAME_TEMPLATE);
   sprintf(logname, format, nextFileToWrite);
   if (sf.open(logname, O_RDWR | O_CREAT | O_TRUNC)) {
     for(int i=0; i<10; i++)
       char buf[32];
       int len = format_databuf(buf, &databuf[i], i+1);
       sf.write(buf, len);
     if(nextFileToWrite > 400)
           nextFileToWrite = 0

 int format_databuf(char *buf, datatype *dbf, short i)
   int len;
   char temp[8], format[60];
   dtostrf(dbf->temp, 0, 2, temp);
   strcpy_P(format, LogFormat);
   len = sprintf(buf, format, i, nextFileToWrite, temp, dbf->smode, dbf->event, dbf->stable);

Fat16? what library do you use? Use SD or SDFat library

I'm using this library for its small size: GitHub - greiman/Fat16: Smaller FAT16 only library for Arduino

The other are too big to fit everything I need into the 32k.

from Fat16 doc

The Arduino Print class uses character at a time writes so it was necessary to use a sync() function to control when data is written to the SD card.

An application which writes to a file using print(), println() or write() must call sync() at the appropriate time to force data and directory information to be written to the SD Card. Data and directory information are also written to the SD card when close() is called.

Applications must use care calling sync() since 2048 bytes of I/O is required to update file and directory information. This includes writing the current data block, reading the block that contains the directory entry for update, writing the directory block back and reading back the current data block.

I'm calling close() on the file handle once every 10 minutes (see code). Isn't that consistent with the documentation? (..."Data and directory information are also written to the SD card when close() is called.")