2017-12-14 7 views
3

私はAzure Storage Tablesにログを記録し、私のアペンダ内からlog4net.GlobalContextのプロパティにアクセスする際の問題を抱えているカスタムアペンダでlog4netを使用しています。 Azure関数の内部からログを取っています。log4netカスタムアペンダからのコンテキストプロパティへのアクセス

追加はかなりストレートでシンプルでうまくいきますが、私はいくつかのカスタムプロパティを追加したいと思います - そのうちの1つはInvocationIdで、Azure関数からしかアクセスできないので、私は最良の方法を知りたいと思いますこれを達成する。

私が迷っているものは何ですか?

アペンダ

protected override void Append(LoggingEvent loggingEvent) 
{ 
    _tableCtx.Log(new LogEntry 
       { 
        Timestamp = loggingEvent.TimeStamp, 
        Message = loggingEvent.RenderedMessage, 
        Level = loggingEvent.Level.Name, 
        // properties is always empty 
        InvocationId = loggingEvent.Properties["InvocationId"], 
        PartitionKey = loggingEvent.LoggerName, 
       }); 
} 

Azureの機能

public static async Task<HttpResponseMessage> MyFunction([HttpTrigger(AuthorizationLevel.Function, "post")]HttpRequestMessage req, ILogger log, ExecutionContext context) 
{ 

    log4net.GlobalContext.Properties["InvocationId"] = context.InvocationId; 
    using (var config = Assembly.GetExecutingAssembly().GetManifestResourceStream("MyFunc.logging.config")) 
    { 
     log4net.Config.XmlConfigurator.Configure(config); 
    } 

    var log = LogManager.GetLogger(context.FunctionName); 
} 
+0

appender xmlファイルでこの種の作業を行う方が簡単かもしれないようですか? https://stackoverflow.com/questions/28775568/add-a-custom-property-to-a-loggingeventdata-programmaticallyを参照してください。 –

答えて

0

私はこれをやってしまいました。それは私が思ったよりも簡単でした。

log4net.LogicalThreadContext.Properties["InvocationId"].ToString() 
1

loggingEvent.GetProperties()["InvocationId"] 

または

をお試しください3210
loggingEvent.LookupProperty("InvocationId") 

は、あなたはlog4netのを初期化した後にプロパティを設定する必要が詳細

1

ためhereを参照してください:

using (var config = Assembly.GetExecutingAssembly().GetManifestResourceStream("MyFunc.logging.config")) 
    { 
     log4net.Config.XmlConfigurator.Configure(config); 
    } 

    var log = LogManager.GetLogger(context.FunctionName); 

    log4net.GlobalContext.Properties["InvocationId"] = context.InvocationId; 

また、唯一それがまだ初期化されていないときにlog4netを初期化する必要があります。すべての呼び出しでそれを行うことはあまり効率的ではありません。

関連する問題