第一个问题是:
我在c#中开发应用程序,创建2个日志文件(.txt文件):一个用于错误,另一个用于用户进行的修改。这两个文件是使用 log4net 创建的。我看到的问题是这些文件可以被编辑,因此被错误地改变了。
我想将这些文件设置为readonly,而log4net仍然可以写入它们。因为如果我只是更改文件中的属性,则不会写下一个日志。
有办法吗?
此外,应用程序的用户可以从应用程序中打开此日志文件。为此,我使用下一个代码:
System.IO.FileInfo finfo = new System.IO.FileInfo("path");
if (finfo.Exists)
{
//finfo.Attributes = System.IO.FileAttributes.ReadOnly;
// I don't use the previous line at the moment, because it blocks the followings logs.
System.Diagnostics.Process.Start("path");
}
这是创建和调用记录器的代码:
public static class CLogger
{
private static readonly ILog logger = LogManager.GetLogger(typeof(CLogger));
static CLogger()
{
XmlConfigurator.Configure(new System.IO.FileInfo("path to .config file"));
}
public static void WriteLog(ELogLevel logLevel, String log)
{
if (logLevel.Equals(ELogLevel.DEBUG))
{
logger.Debug(log);
}
else if (logLevel.Equals(ELogLevel.ERROR))
.
.
.
else if (logLevel.Equals(ELogLevel.WARN))
{
logger.Warn(log);
}
}
}
致电记录器:
CLogger.WriteLog(ELogLevel.ERROR, ex.ToString());
我有一个第二个问题相关:
要创建这2个单独的日志文件,我使用.config文件中的下一行:
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net>
<appender name="LogFileAppender" type="log4net.Appender.FileAppender">
<param name="File" value="PATH...\ErrorLog.log" />
<param name="AppendToFile" value="true" />
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="ERROR"/>
<param name="LevelMax" value="ERROR"/>
</filter>
<layout type="log4net.Layout.PatternLayout">
<param name="Header" value="" />
<param name="Footer" value="" />
<param name="ConversionPattern" value="%d [%t] %-5p %username %m%n" />
</layout>
<threshold value="ERROR" />
</appender>
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="PATH...\TraceLog.log" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="5MB" />
<staticLogFileName value="true" />
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="INFO"/>
<param name="LevelMax" value="INFO"/>
</filter>
<layout type="log4net.Layout.PatternLayout">
<param name="Header" value="" />
<param name="Footer" value="" />
<param name="ConversionPattern" value="%d [%t] %-5p %username %m%n" />
</layout>
<threshold value="INFO" />
</appender>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
<layout type="log4net.Layout.PatternLayout">
<param name="Header" value="[Header]\r\n" />
<param name="Footer" value="[Footer]\r\n" />
<param name="ConversionPattern" value="%d [%t] %-5p %m%n" />
</layout>
<threshold value="ERROR" />
</appender>
<root>
<level value="ERROR" />
<appender-ref ref="LogFileAppender" />
<appender-ref ref="ConsoleAppender" />
<level value="INFO" />
<appender-ref ref="RollingFileAppender" />
</root>
</log4net>
</configuration>
这有效,但我做得还好吗? 我怀疑是否应该使用' LogFileAppender '或' RollingFileAppender ',这就是我使用它们的原因。
提前致谢。
答案 0 :(得分:0)
问题1: 我认为这是接近它的错误方法。如果您担心他们可以偶然修改它,那么您有两种选择:
问题2: “普通”FileAppender将始终写入同一文件,这可能不是您的应用程序偶尔停止的问题,并且您可以在增长过大时删除日志文件。对于长时间运行的应用程序,这不是一个选项:滚动RollingFileAppender将每隔一段时间创建一个新文件(由特定大小或特定时间定义)。这样就可以删除旧的日志文件,永远不会耗尽磁盘空间。
也许您想了解有关appenders here的更多信息。