int main(int argc, char **argv)
{
log_init(argv[0]);
- struct log_stream *ls = log_new_file("/var/log/utterances");
+ struct log_stream *ls = log_new_file("/var/log/utterances", 0);
msg(L_INFO | ls->regnum, "Aye captain, we have a log file");
msg(L_INFO, "Alas, stderr still works");
return 0;
char *orig_name; // Original name with strftime escapes
};
-enum log_file_flag {
- FF_FORMAT_NAME = 1, // Name contains strftime escapes
- FF_CLOSE_FD = 2, // Close the fd with the stream
- FF_FD2_FOLLOWS = 4, // Maintain stderr as a clone of this stream
-};
-
#define MAX_EXPAND 64 // Maximum size of expansion of strftime escapes
static int log_switch_nest;
}
struct log_stream *
-log_new_fd(int fd)
+log_new_fd(int fd, uns flags)
{
struct log_stream *ls = log_new_stream(sizeof(struct file_stream));
struct file_stream *fs = (struct file_stream *) ls;
fs->fd = fd;
+ fs->flags = flags;
ls->msgfmt = LSFMT_DEFAULT;
ls->handler = file_handler;
ls->close = file_close;
return ls;
}
-static struct log_stream *
-do_log_new_file(const char *path, uns more_flags)
+struct log_stream *
+log_new_file(const char *path, uns flags)
{
struct log_stream *ls = log_new_stream(sizeof(struct file_stream));
struct file_stream *fs = (struct file_stream *) ls;
fs->orig_name = xstrdup(path);
if (strchr(path, '%'))
fs->flags = FF_FORMAT_NAME;
- fs->flags |= FF_CLOSE_FD | more_flags;
+ fs->flags |= FF_CLOSE_FD | flags;
ls->msgfmt = LSFMT_DEFAULT;
ls->handler = file_handler;
ls->close = file_close;
return ls;
}
-struct log_stream *
-log_new_file(const char *path)
-{
- return do_log_new_file(path, 0);
-}
-
int
log_switch(void)
{
if (!name)
return;
- struct log_stream *ls = do_log_new_file(name, FF_FD2_FOLLOWS);
+ struct log_stream *ls = log_new_file(name, FF_FD2_FOLLOWS);
struct log_stream *def = log_stream_by_flags(0);
log_rm_substream(def, NULL);
log_add_substream(def, ls);
{
log_init(argv[0]);
log_file("/proc/self/fd/1");
- // struct log_stream *ls = log_new_fd(1);
- // struct log_stream *ls = log_new_file("/tmp/quork-%Y%m%d-%H%M%S");
+ // struct log_stream *ls = log_new_fd(1, 0);
+ // struct log_stream *ls = log_new_file("/tmp/quork-%Y%m%d-%H%M%S", 0);
for (int i=1; i<argc; i++)
msg(L_INFO, argv[i]);
log_close_all();
* even in multi-threaded programs.
***/
-struct log_stream *log_new_file(const char *path); /** Create a stream bound to a log file. **/
-struct log_stream *log_new_fd(int fd); /** Create a stream bound to a file descriptor. **/
+struct log_stream *log_new_file(const char *path, uns flags); /** Create a stream bound to a log file. See `FF_xxx` for @flags. **/
+struct log_stream *log_new_fd(int fd, uns flags); /** Create a stream bound to a file descriptor. See `FF_xxx` for @flags. **/
+
+enum log_file_flag { /** Flags used for file-based logging **/
+ FF_FORMAT_NAME = 1, // Internal: Name contains strftime escapes
+ FF_CLOSE_FD = 2, // Close the fd with the stream (use with log_new_fd())
+ FF_FD2_FOLLOWS = 4, // Maintain stderr as a clone of this stream
+};
/**
* When a time-based name of the log file changes, the logger switches to a new