为了账号安全,请及时绑定邮箱和手机立即绑定

如何以编程方式更改文件位置?

如何以编程方式更改文件位置?

C#
湖上湖 2019-10-28 09:54:34
我是Log4net的新手。我设法通过添加配置文件和简单的日志记录来解决问题。我已经将值硬编码为,"C:\temp\log.txt"但这还不够好。日志必须转到特殊文件夹path = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);并且此路径会根据您使用的是Windows Server 2008,Windows XP还是Vista等而改变...如何仅以编程方式更改log4net中文件的位置?这是我所做的:<configSections><section name="log4net"         type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net"/></configSections><log4net>             <root>        <level value="DEBUG" />        <appender-ref ref="LogFileAppender" />    </root>    <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">        <param name="File" value="C:\temp\log.txt" />        <param name="AppendToFile" value="true" />        <rollingStyle value="Size" />        <maxSizeRollBackups value="10" />        <maximumFileSize value="10MB" />        <staticLogFileName value="true" />        <layout type="log4net.Layout.PatternLayout">            <param name="ConversionPattern" value="%-5p%d{yyyy-MM-dd hh:mm:ss} – %m%n" />        </layout>    </appender></log4net>class Program{    protected static readonly ILog log = LogManager.GetLogger(typeof(Program));    static void Main(string[] args)    {        log4net.Config.XmlConfigurator.Configure();        log.Warn("Log something");        path = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);        // How can I change where I log stuff?    }}只需弄清楚如何更改才能将内容记录到我想要的位置。有什么建议么?非常感谢
查看完整描述

3 回答

?
弑天下

TA贡献1818条经验 获得超7个赞

log4net可以为您解决这个问题。在这种情况下,可以使用log4net.Util.PatternString选项处理程序格式化字符串类型的任何appender属性。PatternString甚至支持SpecialFolder枚举,该枚举启用以下优雅的配置:


<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender" >

    <file type="log4net.Util.PatternString" 

        value="%envFolderPath{CommonApplicationData}\\test.txt" />

    ...

</appender>

这是证明布丁的单元测试:


[Test]

public void Load()

{

    XmlConfigurator.Configure();

    var fileAppender = LogManager.GetRepository()

        .GetAppenders().First(appender => appender is RollingFileAppender);


    var expectedFile = 

        Path.Combine(

            Environment.GetFolderPath(

                Environment.SpecialFolder.CommonApplicationData),

                "test.txt");


    Assert.That(fileAppender, 

        Is.Not.Null & Has.Property("File").EqualTo(expectedFile));

}

以下测试验证log4net实际上已写入磁盘(这基本上使该测试成为“集成”测试,而不是单元测试,但我们暂时将其保留):


[Test]

public void Log4net_WritesToDisk()

{

    var expectedFile = 

        Path.Combine(

            Environment.GetFolderPath(

                Environment.SpecialFolder.CommonApplicationData),

                "test.txt");


    if (File.Exists(expectedFile))

        File.Delete(expectedFile);


    XmlConfigurator.Configure();


    var log = LogManager.GetLogger(typeof (ConfigTest));

    log.Info("Message from test");


    LogManager.Shutdown();


    Assert.That(File.ReadAllText(expectedFile), 

        Text.Contains("Message from test"));

}

注意:我强烈建议使用上面示例中演示的紧凑属性语法。删除所有这些“ <property name =”可以使您的配置更具可读性。


查看完整回答
反对 回复 2019-10-28
  • 3 回答
  • 0 关注
  • 371 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信