如何禁止在应用程序启动时创建空日志文件?
我已经在我的应用程序中成功配置了 log4net,但有一件事对我来说有点烦人。
即使没有发生错误,日志文件也会在我的应用程序启动后创建(空)。我想仅在出现错误后才创建日志文件。
I have configured log4net in my app successfully but one thing is a little bit annoying for me.
The log file is created (empty) after my app start even if no error occurs. I would like to log file be created only after some error.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
我实际上在这个线程中找到了一种方法:
http://www.l4ndash.com/Log4NetMailArchive/tabid/70/forumid/1/postid/18271/view/topic/Default.aspx
我已经测试了第一种方法,它有效。以防万一该链接不再有效,我将在此处重现代码。基本上,作者指出有两种方法可以做到这一点。
第一种方法:
创建一个新的锁定模型,该模型仅在该记录器的适当阈值有效时才获取锁定(并创建文件)。
现在在配置文件中,将阈值设置为:
并确保在建模时设置这个新的 LockingModel:
我将其与滚动文件附加程序一起使用。
链接中列出了第二种方法。我还没有尝试过这种技术,但它在技术上似乎是可行的。
I actually found a way to do this in this thread:
http://www.l4ndash.com/Log4NetMailArchive/tabid/70/forumid/1/postid/18271/view/topic/Default.aspx
I've tested the first method and it works. Just in case that link is not longer good I'll reproduce the code here. Basically the author states that there are two ways of doing this.
First way:
Create a new locking model that only acquires a lock (and creates the file) if the appropriate threshold for that logger works.
Now in the config file, set the threshold to start out as:
and make sure you set this new LockingModel as you model:
I'm using this with a rolling file appender.
The second method is listed at the link. I haven't tried this technique but it seems to be technically sound.
我知道这是一个老问题,但我认为这对其他人可能有用。
我们遇到了类似的情况,要求应用程序在没有发生错误的情况下不应留下空日志文件。
我们通过创建以下自定义 LockingModel 类来解决这个问题:
它派生自 FileAppender.MinimalLock 类,该类将在写入每条日志消息后释放日志文件上的锁定。
我们添加了额外的功能,如果锁定释放后日志文件仍然为空,则将删除该日志文件。如果应用程序运行并退出时没有任何错误,它可以防止应用程序留下空的错误日志文件。
优点
缺点
I know this is an old question but I think this can be useful for someone else.
We came across a similar situation where it was required that the application shouldn't leave an empty log file if no errors occurred.
We solved it by creating the following custom LockingModel class:
It is derived from the FileAppender.MinimalLock class that will release the lock on the log file after writing each log message.
We added extra functionality that will delete the log file if it is still empty after the lock is released. It prevents the application from leaving empty error log files if the applications runs and exits without any errors.
Pros
Cons
以下内容对我有用。配置记录器时会发生对 OpenFile() 的第一次调用。后续调用是在生成实际日志消息时进行的。
在配置文件中,更改appender
log4Net源代码的顺序如下:
The following worked for me.The first call to OpenFile() occurs when the logger is configured. Subsequent calls are when actual log message is generated.
And in the config file, change the appender
The sequence from log4Net source is as below:
这种方法的问题在于,如果文件存在但是只读的,或者位于不存在的目录中等,您将无法发现,直到另一个错误已经导致问题。您确实希望在应用程序的其余部分启动之前确保日志记录正常工作。
无论如何,可能有一种方法可以做到这一点,但如果没有,我怀疑这就是原因。
The problem with that approach is that then if the file exists but is read-only, or is in a directory which doesn't exist etc, you won't find out until another error is already causing problems. You really want to be confident that logging is working before the rest of the app starts.
There may be a way of doing this anyway, but if not I suspect that this is the reason.
另一种非常简单的方法在 邮件列表存档的此消息
基本上,对于 log4net,日志文件是在配置记录器时创建的。将其配置为以其他方式执行有点困难。解决方案是推迟配置的执行。上面的消息建议在设置记录器时执行以下操作:
我通常使用 assembly 属性配置 log4net,该属性会自动配置记录器(从而创建日志文件),以及日志的简单 getter:
但是删除它并在上面的 getter 中添加额外的逻辑反而解决了我的问题。
注意:总的来说,我同意在大多数情况下最好在应用程序启动时配置记录器并创建文件(甚至写入文件)。
Another method that is quite simple is described in this message of the mailing list archive
Basically, with log4net, the log file is created when the logger is configured. To configure it to do otherwise is a bit hacky. The solution is to defer the execution of the configuration. The message above suggests doing the following when setting up the logger:
I usually configure log4net with the assembly attribute, which configures the logger automatically (thus creating the log file), and a simple getter for the log:
But removing that and adding in the above getter with the additional logic instead solved the problem for me.
Note: in general I agree that in most cases it would be best to configure the logger and create the file (and even write to it) on application startup.
AcquireLock 和 ReleaseLock 方法对我有用,但令我困扰的是文件被创建/删除了很多次。这是另一个类似的选项,可以在程序完成时关闭记录器并删除空日志文件。完成日志记录后,只需调用 RemoveEmptyLogFile 即可。
AcquireLock and ReleaseLock method worked for me, but it bothered me that the file was created/deleted that many times. Here is another similar option that shuts down the logger and deletes the empty logfile when the program completed. Just call RemoveEmptyLogFile when you are done logging.