1. ホーム
  2. c#

ファイルの保存場所をプログラムで変更するにはどうしたらいいですか?

2023-09-07 15:21:06

質問

私は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?
    }
}

ただ、ログを記録したい場所に変更するにはどうすればいいか、考える必要があります。

何か提案はありますか? どうもありがとうございます。

どのように解決するのですか?

log4netはこれを処理することができます。文字列型のアペンダープロパティはすべてフォーマットすることができ、この場合は log4net.Util.PatternString オプションハンドラを使用します。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が実際にディスクに書き込むことを確認します(これは基本的にユニットテストではなく、quot;integration"テストになりますが、今のところそのままにしておきます)。

[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=" を削除することで、設定がより読みやすくなります。