When does log4net write or commit the log to file?
We use t开发者_StackOverflow社区he log4net to log the winform application's event and error. Our customer want check the log file during the application running. But I can't find out when and how the log4net do the write(commit) operation. And how to meet the customer's requirement, except creating another logger by myself. Any help? Thanks.
If you're using the FileAppender
, this appender inherits the TextWriterAppender
, which in turn exposes the ImmediateFlush
property. The value of this property is true
by default, and forces the appender to do a Flush()
on the underlying stream for each Append operation.
Depending on how you envision the customer "monitoring" the log file, an idea could be to enable monitoring from within your application. This can be done by in addition to appending to a file, using the MemoryAppender and reading events from that appender.
One thing I did notice when I was using log4net in a SharePoint instance is that, depending on your security configuration and the implementation of your configuration loading, the user that spins up the application pool may not have rights to write to the local file system to create the log file.
Because of this you need to ensure that your configuration is invoked with the right credentials, in SharePoint it would be in an elevated security context. Not entirely related, but it might be an issue you run across.
see this SO post for howto programmatically flush a log4net log. Joe's answer while slightly inaccurate is roughly the same code and so would presumably work for flushing all buffered appenders.
You talk about a log file, so presumably you're using FileAppender or a derived class. This will buffer output by default. Buffered output is much more efficient, so to meet your requirement, I'd suggest you provide some mechanism to flush the log before viewing it, rather than forcing a commit after each write operation.
You can do this with code like the following:
foreach (IAppender appender in LogManager.GetRepository().GetAppenders())
{
BufferingAppenderSkeleton b = appender as BufferingAppenderSkeleton;
if (b != null) b.Flush();
}
精彩评论