当我在appender中命名文件时,Log4Net找不到%username属性

Cra*_*aig 5 .net log4net

log4net没有正确PatternString替换我的登录名.我想要我的日志

日志\ YYYYMMDD\MSMQcore_ [用户名]的.log

当我使用该%username属性时,我在路径中获取域,这会在其中添加另一个文件夹间接.我只想要用户名.

日志\ YYYYMMDD\MSMQcore_ [域]\[用户名]的.log

任何人都有一个在appender的文件名中插入"用户名"的例子?我尝试了很多东西,我还在摸不着头脑.

<appender name="core_Appender" type="log4net.Appender.RollingFileAppender" >
<!-- <file type="log4net.Util.PatternString"  value="Logs/%date{yyyyMMdd}/MSMQcore_%identity.log" /> -->
<!-- <file type="log4net.Util.PatternString"  value="Logs/%date{yyyyMMdd}/MSMQcore_%property{user}.log" /> -->
<file type="log4net.Util.PatternString"  value="Logs/%date{yyyyMMdd}/MSMQcore_%username.log" />
</appender>
Run Code Online (Sandbox Code Playgroud)

Pet*_*old 9

使用环境变量模式对我有用:

<file type="log4net.Util.PatternString" value="Logs\\%env{USERNAME}.txt" />
Run Code Online (Sandbox Code Playgroud)

更新:如果USERNAME环境变量不是选项,则可以替代子类化PatternString.这是一个简单的实现:

public class MyPatternString : PatternString
{
    public MyPatternString()
    {
        AddConverter("usernameonly", typeof(UserNameOnlyConverter));
    }    
}

public class UserNameOnlyConverter : PatternConverter 
{
    override protected void Convert(TextWriter writer, object state) 
    {
        var windowsIdentity = WindowsIdentity.GetCurrent();
        if (windowsIdentity != null && windowsIdentity.Name != null)
        {
            var name = windowsIdentity.Name.Split('\\')[1];
            writer.Write(name);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

新设置如下所示:

<file type="MyPatternString" value="Logs\\%usernameonly.txt" />
Run Code Online (Sandbox Code Playgroud)

更新2:回答为什么%identity和%property {user}不起作用:

%identity模式选取当前线程上的identity属性.这个属性在我的测试中为null,可能是这样,直到为运行的线程分配一个特定的Windows标识.这在appender的上下文中不起作用,因为您不知道哪个线程将执行实际的附加.

%属性模式从GlobalContext和ThreadContext类中获取属性.默认情况下,仅在GlobalContext中注册log4net:HostName(LoggingEvent.HostNameProperty).因此,除非您在这些上下文中主动注册属性,否则不能将它们与%属性模式一起使用.同样,ThreadContext在appender的上下文中是无用的,因为你无法知道哪个线程将执行追加.

也就是说,在应用程序启动例程中的某个地方注册GlobalContext.Properties集合中名为username的属性,将使%property {username}能够按预期工作.