我正在尝试编写一个C#代码,它通过log4net API在运行时检索 log4net 日志文件的名称模式。
也就是说,如果在 log4net.config 中定义了以下appender:
<appender name="MyAppender" type="log4net.Appender.RollingFileAppender">
<file type="log4net.Util.PatternString" value="%date{yyyy}\%date{MM}\%date{dd}\%property{Id}.log" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="16" />
<maximumFileSize value="1MB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message%newline" />
</layout>
</appender>
我想在代码中的字符串变量中获取%date {yyyy} \%date {MM} \%date {dd} \%property {Id} .log (不解析< em> log4net.config 作为纯XML)。
有没有人有想法来解决这个问题?
提前谢谢。
答案 0 :(得分:2)
此模式的值将位于File
实例的FileAppender
属性中,该实例是日志存储库的一部分。
进入追随者可以通过几种不同的方式完成。
ILogger
个实例(例如,您从LogManager.GetLogger()
获得的内容),那么就会有一个Appenders
属性。这将为您提供与日志记录层次结构相关联的任何追加器。LogManager.GetRepository()
来获取包含整个记录器和appender层次结构的Heirarchy
对象。该方法需要一个程序集,因此传递GetCallingAssembly()
以获取默认值。该类有一个GetAppenders()
方法,它返回所有已配置的appender,但它不会告诉你哪些与哪些记录器相关联。从那里,只需查看正确类型的追加者(例如FileAppender
或RollingFileAppender
),然后阅读它的File
属性。
答案 1 :(得分:0)
我认为您想要子类化RollingFileAppender,并在配置文件中使用您的子类,而不是基类。确保在classname前面加上完整的命名空间,以便log4net可以找到它。
我的代码中只有一个UDPAppender子类。我添加了这样的覆盖:
public override void ActivateOptions()
{
base.ActivateOptions();
}
当我在基类调用之前打破时,我在本地窗口中检查了'this'并看到了UDPAppender'成员'的值。
答案 2 :(得分:0)
Michael Edenfield的解释很好。在这里实现。
private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
string fileName = ((RollingFileAppender)log.Logger.Repository.GetCurrentLoggers()
.Where(e => e.Name == "Your namespace.class").ToList()[0]
.Repository.GetAppenders()
.Where(e => e.Name == "MyAppender").ToList()[0]).File.ToString();
答案 3 :(得分:0)
我可以使用以下代码获取<file value>
的值:
((log4net.Appender.FileAppender) ((log4net.Appender.IAppender[])
( (log4net.Repository.Hierarchy.Logger)
log.Logger).Appenders.SyncRoot)[0]).File