let file_logger conf shard_id fn =
  let chn = open_out fn in
  let line = ref 1 in

  let fwrite ev =
    List.iter
      (fun l -> output_string chn l; output_char chn '\n'; incr line)
      (format_log_event ev);
    flush chn
  in
  let fpos () =
    Some { filename = fn; line = !line }
  in
  let fclose () =
    close_out chn
  in
    {
      lshard = shard_id;
      fwrite = fwrite;
      fpos   = fpos;
      fclose = fclose;
    }