aliyun-net-sdk-core/Utils/CommonLog.cs (116 lines of code) (raw):
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using Aliyun.Acs.Core.Exceptions;
using Aliyun.Acs.Core.Http;
using Aliyun.Acs.Core.Logging;
namespace Aliyun.Acs.Core.Utils
{
public class CommonLog
{
private const string RegexPattern = @"{(.*?)}";
private static readonly ILog Logger = LogProvider.For<CommonLog>();
private static volatile bool s_enableLogger;
private static volatile IDictionary<string, string> LoggerMessageMap = new Dictionary<string, string>();
internal const string DefaultTemplate = "{channel} {method} {uri} {version} {code} {cost} {hostname} {pid} {NewLine}";
internal static long ExecuteTime { get; set; }
private static volatile string template;
private static void BuildKeyValueMap<T>(AcsRequest<T> request, HttpResponse response, long executeTime)
where T : AcsResponse
{
try
{
var requestHeader = request.Headers == null
? ""
: DictionaryUtil.TransformDicToString(request.Headers);
var requestContent = request.Content == null
? ""
: Encoding.Default.GetString(request.Content);
var responseHeader = response.Headers == null
? ""
: DictionaryUtil.TransformDicToString(response.Headers);
var responseContent = response.Content == null
? ""
: Encoding.Default.GetString(response.Content);
var hostName = Dns.GetHostName();
if (null != request.Url)
{
var requestUri = new Uri(request.Url);
LoggerMessageMap.Add("host", requestUri.Host);
LoggerMessageMap.Add("target", requestUri.PathAndQuery + requestUri.Fragment);
}
LoggerMessageMap.Add("channel", "AlibabaCloud.");
LoggerMessageMap.Add("request", requestHeader + requestContent);
LoggerMessageMap.Add("req_headers", requestHeader);
LoggerMessageMap.Add("method", request.Method.ToString());
LoggerMessageMap.Add("uri", request.Url);
LoggerMessageMap.Add("version", "HTTP/" + response.HttpVersion);
LoggerMessageMap.Add("hostname", hostName);
LoggerMessageMap.Add("code", response.Status.ToString());
LoggerMessageMap.Add("error", responseContent);
LoggerMessageMap.Add("response", responseHeader + responseContent + response.Status);
LoggerMessageMap.Add("res_headers", responseHeader);
LoggerMessageMap.Add("pid", Process.GetCurrentProcess().Id.ToString());
LoggerMessageMap.Add("cost", executeTime + "ms");
}
catch (Exception ex)
{
LogException(ex, "ErrorCode", ex.ToString());
throw new ClientException(ex.ToString());
}
}
internal static void EnableLogger(string loggerTemplate = DefaultTemplate)
{
template = loggerTemplate;
s_enableLogger = true;
}
internal static void DisableLogger()
{
s_enableLogger = false;
}
internal static bool GetEnableLoggerStatus()
{
return s_enableLogger;
}
internal static void LogInfo<T>(AcsRequest<T> request, HttpResponse httpResponse, long executeTime)
where T : AcsResponse
{
if (!s_enableLogger)
{
return;
}
BuildKeyValueMap(request, httpResponse, executeTime);
var logKey = new List<string>();
var logValue = new List<string>();
var re = new Regex(RegexPattern, RegexOptions.IgnoreCase | RegexOptions.Compiled);
var matchCollection = re.Matches(template);
if (0 < matchCollection.Count)
{
foreach (Match item in matchCollection)
{
logKey.Add(item.Value.Trim('{', '}'));
}
}
foreach (var item in logKey)
{
string value;
LoggerMessageMap.TryGetValue(item, out value);
logValue.Add(value);
}
var logParameters = logValue.Cast<object>().ToArray();
Logger.Info(template, logParameters);
LoggerMessageMap = new Dictionary<string, string>();
}
internal static void LogException(Exception ex, string errorCode, string errorMessage)
{
if (!s_enableLogger)
{
return;
}
Logger.Error(ex,
string.Format("AlibabaCloud. ExceptionMessage: ErrorCode:{0}, ErrorMessage:{1},", errorCode,
errorMessage));
}
}
}