これはもしかしたらみんな使ってますか
void debug( const char *format, ... ) {
  FILE *fp;
  va_list argptr;
  if ( (fp=fopen( "debug.log", "a")) != NULL ){
    va_start( argptr, format );
    vfprintf( fp, format, argptr );
    va_end( argptr );
    fclose(fp);
  }
  return;
}
va_list の使い方が正しいのかどうかわかんないけど。

あと,自作じゃないんで紹介だけなんだけど
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/printf.3.html
これの例に挙げられてる make_message() 関数はわりと重宝してます。
# ていうか manpage だから常識の範囲内? 笑い