Skip to content

Commit e417a0a

Browse files
committed
fix: 优化日志跟踪ID信息
1 parent 5f178a3 commit e417a0a

File tree

18 files changed

+296
-221
lines changed

18 files changed

+296
-221
lines changed
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
using System;
2+
using System.Diagnostics;
3+
using Bing.AspNetCore.WebClientInfo;
4+
using Bing.DependencyInjection;
5+
using Bing.Logging;
6+
using Bing.Tracing;
7+
using Microsoft.AspNetCore.Http;
8+
using Microsoft.AspNetCore.Http.Extensions;
9+
using Microsoft.Extensions.DependencyInjection;
10+
11+
namespace Bing.AspNetCore.Logs
12+
{
13+
/// <summary>
14+
/// AspNetCore日志上下文访问器
15+
/// </summary>
16+
[Dependency(ServiceLifetime.Scoped, ReplaceExisting = true)]
17+
public class AspNetCoreLogContextAccessor : LogContextAccessor
18+
{
19+
/// <summary>
20+
/// Http上下文访问器
21+
/// </summary>
22+
protected IHttpContextAccessor HttpContextAccessor { get; }
23+
24+
/// <summary>
25+
/// Web客户端信息提供程序
26+
/// </summary>
27+
protected IWebClientInfoProvider WebClientInfoProvider { get; }
28+
29+
/// <summary>
30+
/// 初始化一个<see cref="AspNetCoreLogContextAccessor"/>类型的实例
31+
/// </summary>
32+
/// <param name="webClientInfoProvider">Web客户端信息提供程序</param>
33+
/// <param name="httpContextAccessor">Http上下文访问器</param>
34+
public AspNetCoreLogContextAccessor(
35+
IHttpContextAccessor httpContextAccessor,
36+
IWebClientInfoProvider webClientInfoProvider)
37+
{
38+
HttpContextAccessor = httpContextAccessor;
39+
WebClientInfoProvider = webClientInfoProvider;
40+
}
41+
42+
/// <summary>
43+
/// 创建日志上下文
44+
/// </summary>
45+
protected override LogContext Create()
46+
{
47+
var context = base.Create();
48+
context.Ip = WebClientInfoProvider.ClientIpAddress;
49+
context.Browser = WebClientInfoProvider.ClientIpAddress;
50+
context.Url = HttpContextAccessor.HttpContext?.Request?.GetDisplayUrl();
51+
context.IsWebEnv = HttpContextAccessor.HttpContext?.Request != null;
52+
if (!context.IsWebEnv)
53+
context.TraceId = base.GetTraceId();
54+
return context;
55+
}
56+
57+
/// <summary>
58+
/// 获取跟踪标识
59+
/// </summary>
60+
protected override string GetTraceId()
61+
{
62+
if (TraceIdContext.Current != null)
63+
return TraceIdContext.Current.TraceId;
64+
var correlationId = HttpContextAccessor.HttpContext?.Request.Headers["X-Correlation-Id"];
65+
if (!string.IsNullOrWhiteSpace(correlationId))
66+
return correlationId;
67+
var traceId = HttpContextAccessor.HttpContext?.TraceIdentifier;
68+
return string.IsNullOrWhiteSpace(traceId) ? Guid.NewGuid().ToString("N") : Guid.TryParse(traceId, out _) ? traceId : Guid.NewGuid().ToString("N");
69+
}
70+
}
71+
}

framework/src/Bing.AspNetCore/Bing/AspNetCore/Logs/SysLogger.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,11 @@ public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Except
4242
var message = formatter(state, exception);
4343
if (string.IsNullOrEmpty(message) && exception == null)
4444
return;
45-
var log = Bing.Logs.Log.GetLog(LogName);
45+
var log = Bing.Logs.Log.GetLog(CategoryName);
4646
log
4747
.Tag(LogName)
4848
.Tag(CategoryName)
49-
.Caption($"系统日志:{CategoryName}")
49+
.Caption($"系统日志:{message}")
5050
.Content($"事件ID:{eventId.Id}")
5151
.Content($"事件名称:{eventId.Name}")
5252
.Content(message);

framework/src/Bing.AspNetCore/project.dependency.props

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
</ItemGroup>
1010

1111
<ItemGroup>
12+
<ProjectReference Include="..\Bing.Logging\Bing.Logging.csproj" />
1213
<ProjectReference Include="..\Bing.Logs\Bing.Logs.csproj" />
1314
<ProjectReference Include="..\Bing\Bing.csproj" />
1415
</ItemGroup>

framework/src/Bing.Logging.Serilog/Bing/Logging/Serilog/Enrichers/LogContextEnricher.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System.Linq;
22
using Bing.DependencyInjection;
33
using Bing.Extensions;
4+
using Bing.Tracing;
45
using Serilog.Core;
56
using Serilog.Events;
67

@@ -69,9 +70,12 @@ private void AddDuration(LogEvent logEvent, ILogEventPropertyFactory propertyFac
6970
/// </summary>
7071
private void AddTraceId(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)
7172
{
72-
if (string.IsNullOrWhiteSpace(_context.TraceId))
73+
var traceId = _context.TraceId;
74+
if (!_context.IsWebEnv)
75+
traceId = TraceIdContext.Current?.TraceId;
76+
if (string.IsNullOrWhiteSpace(traceId))
7377
return;
74-
var property = propertyFactory.CreateProperty("TraceId", _context.TraceId);
78+
var property = propertyFactory.CreateProperty("TraceId", traceId);
7579
logEvent.AddOrUpdateProperty(property);
7680
}
7781

framework/src/Bing.Logging/Bing/Logging/ILogContextAccessor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@ public interface ILogContextAccessor
88
/// <summary>
99
/// 日志上下文
1010
/// </summary>
11-
LogContext Context { get; set; }
11+
LogContext Context { get; }
1212
}
1313
}

framework/src/Bing.Logging/Bing/Logging/ILoggerWrapper.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,16 @@ public interface ILoggerWrapper
2525
/// <param name="formatter">消息格式化操作</param>
2626
void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter);
2727

28+
/// <summary>
29+
/// 写日志
30+
/// </summary>
31+
/// <param name="logLevel">日志级别</param>
32+
/// <param name="eventId">日志事件标识</param>
33+
/// <param name="exception">异常</param>
34+
/// <param name="message">日志消息</param>
35+
/// <param name="args">日志消息参数</param>
36+
void Log(LogLevel logLevel, EventId eventId, Exception exception, string message, params object[] args);
37+
2838
/// <summary>
2939
/// 开启日志范围
3040
/// </summary>

framework/src/Bing.Logging/Bing/Logging/Log.cs

Lines changed: 33 additions & 135 deletions
Original file line numberDiff line numberDiff line change
@@ -209,168 +209,42 @@ public virtual ILog Message(string message, params object[] args)
209209
#region LogTrace(写跟踪日志)
210210

211211
/// <inheritdoc />
212-
public virtual ILog LogTrace([CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0)
213-
{
214-
try
215-
{
216-
Init();
217-
if (LogMessage.Length > 0)
218-
{
219-
Logger.LogTrace(LogEventId, LogException, GetMessage(), GetMessageArgs());
220-
return this;
221-
}
222-
223-
LogLevel = LogLevel.Trace;
224-
return WriteLog();
225-
}
226-
finally
227-
{
228-
Clear();
229-
}
230-
}
212+
public virtual ILog LogTrace([CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0) => WriteLog(LogLevel.Trace, memberName, sourceFilePath, sourceLineNumber);
231213

232214
#endregion
233215

234216
#region LogDebug(写调试日志)
235217

236218
/// <inheritdoc />
237-
public virtual ILog LogDebug([CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0)
238-
{
239-
try
240-
{
241-
Init();
242-
if (LogMessage.Length > 0)
243-
{
244-
Logger.LogDebug(LogEventId, LogException, GetMessage(), GetMessageArgs());
245-
return this;
246-
}
247-
248-
LogLevel = LogLevel.Debug;
249-
return WriteLog();
250-
}
251-
finally
252-
{
253-
Clear();
254-
}
255-
}
219+
public virtual ILog LogDebug([CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0) => WriteLog(LogLevel.Debug, memberName, sourceFilePath, sourceLineNumber);
256220

257221
#endregion
258222

259223
#region LogInformation(写信息日志)
260224

261225
/// <inheritdoc />
262-
public virtual ILog LogInformation([CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0)
263-
{
264-
try
265-
{
266-
CurrentDescriptor.Context.SetCallerInfo(memberName, sourceFilePath, sourceLineNumber);
267-
var scopeDict = CurrentDescriptor.Context.ExposeScopeState();
268-
if (scopeDict.Any())
269-
{
270-
using (Logger.BeginScope(scopeDict))
271-
{
272-
Init();
273-
if (LogMessage.Length > 0)
274-
{
275-
Logger.LogInformation(LogEventId, LogException, GetMessage(), GetMessageArgs());
276-
return this;
277-
}
278-
279-
LogLevel = LogLevel.Information;
280-
return WriteLog();
281-
}
282-
}
283-
Debug.WriteLine($"【调试日志】未进入作用域字典");
284-
Init();
285-
if (LogMessage.Length > 0)
286-
{
287-
Logger.LogInformation(LogEventId, LogException, GetMessage(), GetMessageArgs());
288-
return this;
289-
}
290-
291-
LogLevel = LogLevel.Information;
292-
return WriteLog();
293-
}
294-
finally
295-
{
296-
Clear();
297-
}
298-
}
226+
public virtual ILog LogInformation([CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0) => WriteLog(LogLevel.Information, memberName, sourceFilePath, sourceLineNumber);
299227

300228
#endregion
301229

302230
#region LogWarning(写警告日志)
303231

304232
/// <inheritdoc />
305-
public virtual ILog LogWarning([CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0)
306-
{
307-
try
308-
{
309-
Init();
310-
if (LogMessage.Length > 0)
311-
{
312-
Logger.LogWarning(LogEventId, LogException, GetMessage(), GetMessageArgs());
313-
return this;
314-
}
315-
316-
LogLevel = LogLevel.Warning;
317-
return WriteLog();
318-
}
319-
finally
320-
{
321-
Clear();
322-
}
323-
}
233+
public virtual ILog LogWarning([CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0) => WriteLog(LogLevel.Warning, memberName, sourceFilePath, sourceLineNumber);
324234

325235
#endregion
326236

327237
#region LogError(写错误日志)
328238

329239
/// <inheritdoc />
330-
public virtual ILog LogError([CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0)
331-
{
332-
try
333-
{
334-
Init();
335-
if (LogMessage.Length > 0)
336-
{
337-
Logger.LogError(LogEventId, LogException, GetMessage(), GetMessageArgs());
338-
return this;
339-
}
340-
341-
LogLevel = LogLevel.Error;
342-
return WriteLog();
343-
}
344-
finally
345-
{
346-
Clear();
347-
}
348-
}
240+
public virtual ILog LogError([CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0) => WriteLog(LogLevel.Error, memberName, sourceFilePath, sourceLineNumber);
349241

350242
#endregion
351243

352244
#region LogCritical(写致命日志)
353245

354246
/// <inheritdoc />
355-
public virtual ILog LogCritical([CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0)
356-
{
357-
try
358-
{
359-
Init();
360-
if (LogMessage.Length > 0)
361-
{
362-
Logger.LogCritical(LogEventId, LogException, GetMessage(), GetMessageArgs());
363-
return this;
364-
}
365-
366-
LogLevel = LogLevel.Critical;
367-
return WriteLog();
368-
}
369-
finally
370-
{
371-
Clear();
372-
}
373-
}
247+
public virtual ILog LogCritical([CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0) => WriteLog(LogLevel.Critical, memberName, sourceFilePath, sourceLineNumber);
374248

375249
#endregion
376250

@@ -453,10 +327,34 @@ protected virtual object[] GetMessageArgs()
453327
/// <summary>
454328
/// 写日志
455329
/// </summary>
456-
protected virtual ILog WriteLog()
330+
/// <param name="level">日志级别</param>
331+
/// <param name="memberName">方法名</param>
332+
/// <param name="sourceFilePath">文件路径</param>
333+
/// <param name="sourceLineNumber">行号</param>
334+
protected virtual ILog WriteLog(LogLevel level, string memberName, string sourceFilePath, int sourceLineNumber)
457335
{
458-
Logger.Log(LogLevel, LogEventId, GetContent(), LogException, GetFormatMessage);
459-
return this;
336+
try
337+
{
338+
LogLevel = level;
339+
CurrentDescriptor.Context.SetCallerInfo(memberName, sourceFilePath, sourceLineNumber);
340+
var scopeDict = CurrentDescriptor.Context.ExposeScopeState();
341+
using (Logger.BeginScope(scopeDict))
342+
{
343+
Init();
344+
if (LogMessage.Length > 0)
345+
{
346+
Logger.Log(level, LogEventId, LogException, GetMessage(), GetMessageArgs());
347+
return this;
348+
}
349+
350+
Logger.Log(LogLevel, LogEventId, GetContent(), LogException, GetFormatMessage);
351+
return this;
352+
}
353+
}
354+
finally
355+
{
356+
Clear();
357+
}
460358
}
461359

462360
/// <summary>

0 commit comments

Comments
 (0)