コンストラクタを使用して初期化することによって設定される外部ログ用のクラスを作成したいとします。私は、このクラスをFunctionの全期間を通して複数回使用できるようにしたいと考えています。Azure関数でクラスを使用する
using System.Net;
private static Logger logger;
public static async Task<HttpResponseMessage> Run(HttpRequestMessage req,
TraceWriter log, ExecutionContext executionContext)
{
log.Info("C# HTTP trigger function processed a request.");
string invocationId = executionContext.InvocationId.ToString();
logger = new Logger(invocationId);
logger.Log("Start");
// parse query parameter
string name = req.GetQueryNameValuePairs()
.FirstOrDefault(q => string.Compare(q.Key, "name", true) == 0)
.Value;
// Get request body
dynamic data = await req.Content.ReadAsAsync<object>();
// Set name to query string or body data
name = name ?? data?.name;
logger.Log("Finish");
return name == null
? req.CreateResponse(HttpStatusCode.BadRequest, "Please pass a name on the query string or in the request body")
: req.CreateResponse(HttpStatusCode.OK, "Hello " + name);
}
public class Logger
{
private string _invocationId;
public Logger(string invocationId)
{
_invocationId = invocationId;
}
public void Log(string message)
{
message = $"{_invocationId} | {message}";
// log to Splunk
}
}
Loggerクラスを関数全体で「グローバルに」使用する正しい方法はありますか?
private static Logger logger;
public static async Task<HttpResponseMessage> Run(HttpRequestMessage req,
TraceWriter log, ExecutionContext executionContext)
{
log.Info("C# HTTP trigger function processed a request.");
string invocationId = executionContext.InvocationId.ToString();
logger = new Logger(invocationId);
新しくクラスアップしたことは何ですか?
これは私が達成しようとしているものの簡略化されたバージョンです。
ロガーを使用しているスレッドと別のスレッドとの間で競合状態が発生する可能性があるため、静的フィールドとしてはloggerを使用したくないと思います。 – stuartd
@stuartdこんにちはスチュアート、返信いただきありがとうございます。 Runメソッドが静的でなければならないので、静的でないロガーを作成するとエラーが発生することがあります。 "非静的なフィールド、メソッド、またはプロパティにオブジェクト参照が必要です"。 – Chris
@mikhailが彼の答えで示唆しているように、それをローカル変数にします。 – stuartd