我想創建一個外部日誌記錄類,它通過構造函數初始化來設置。然後我希望能夠在整個函數生命週期中多次使用這個類。在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
}
}
這是在整個函數中使用我的記錄器類「全局」的正確方法嗎?
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