1

10個のdllを含むプロジェクトがあり、各dllはlog4netを使用してログに記録します。プロジェクトは私が始めたものではありません。私はこのようにそれを手に入れました、そして私はそれを続ける必要があります。log4netを使用するのは初めてなので、実行時に構成ファイル(xml)とログファイル(ロガーがログを書き込むファイル)を取得する方法を知りたいです。ブレークポイントを使用してアプリケーションの実行を停止し、クイックウォッチウィンドウを使用してこれらのパラメーターを取得できるようにしたいと思います。

手伝ってくれてありがとう。

4

3 に答える 3

2

個人的には、log4netがどのように構成されているかを確認し、そこから情報をログに記録する場所を決定する方がよいため、これについて間違った方向に進んでいる可能性があると思います。

通常の開始場所はapp.configファイルで、log4net構成自体、または別の外部ファイルへの参照が含まれている場合がありますが、構成は実行時に完全に実行することもできるため、構成ファイルがあるという保証はありません。しかし、あなたは見てみることができます

log4net.Config.XmlConfigurator.m_repositoryName2ConfigAndWatchHandler["log4net-default-repository"]

設定ファイルの場所が表示される場合があります。

ファイル名はトリッキーです。

  • ロギングが別のデバイス(コンソールやデータベースなど)に送られる可能性があるため、ファイルがない可能性があります
  • ロギングが無効になっているため、ファイルがない可能性があります。
  • 2つ以上のファイルにログを記録している可能性があります
  • ファイル名はclass/dllに依存する可能性があります
  • ロギングは、あるクラスでは有効にし、別のクラスでは無効にすることができます。
于 2012-10-15T15:15:42.247 に答える
1

これは似たようなもののサンプルです:

    public static void ChangeRemoteAddress(System.Net.IPAddress remoteAddressIp)
    {
        var hier = log4net.LogManager.GetRepository() as Hierarchy;
        if (hier == null)
        {
            Console.WriteLine("Unable to change Syslog filename, null hierarchy");
            return;
        }
        var sysLogAppender =
            (SyslogAppender)hier.GetAppenders().
                                      First(appender => appender.Name.Equals("UdpAppender",
                                          StringComparison.InvariantCultureIgnoreCase));

        if (null == sysLogAppender)
        {
            Console.WriteLine("Unable to change Syslog filename, appender not found");
            return;
        }
        sysLogAppender.RemoteAddress = remoteAddressIp;
        sysLogAppender.ActivateOptions();
    }

'hierarchy'を取得してから、アペンダーを取得して、名前で必要なアペンダーを確認できます。私の場合、UDPアペンダーのリモートアドレスをプログラムで変更できるようにしたいのですが、この方法で事前定義された「設定」を処理できます。カスタムの「設定」を使用している場合は少し厄介ですが、これでうまくいくはずです。

したがって、これにより、XML構成ファイルに(オブジェクトとして)アクセスできるようになります。たとえば、ローリングファイルアペンダーのログファイルのファイル名には、同様の方法でアクセスします。

于 2012-10-15T14:48:19.510 に答える
0

私の場合、dllは例外のみを返す必要があります。アプリケーションはlog4netまたは他のロガーを使用して、dllからの例外をログに記録できます。log.configへのパス私は通常app.configappSettingsに保存しています。

あなたはdllの内部を次のようなものにすることを試みることができます

const string RELATIVE_LOGGER_CONFIG_FILE_PATH="log.config";
string directory=System.IO.Path.GetDirectoryName(Assembly.GetCallingAssembly().Location);
return System.IO.Path.Combine(directory, RELATIVE_LOGGER_CONFIG_FILE_PATH)

、しかし私は間違っていると思います。dllから例外を返すだけです。

PSこのコードセットlog4netの構成ファイル

log4net.Config.XmlConfigurator.Configure(new FileInfo(configFilePath));   
于 2012-10-15T14:03:37.547 に答える