Skip to content

Commit 5f178a3

Browse files
committed
fix: 增加日志调用者信息
1 parent 5c69d5f commit 5f178a3

File tree

12 files changed

+239
-57
lines changed

12 files changed

+239
-57
lines changed

framework/src/Bing.Logging.Sinks.Exceptionless/Serilog/Sinks/Exceptionless/ExceptionlessSink.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Linq;
4-
using Bing;
54
using Bing.Logging.ExtraSupports;
65
using Bing.Logging.Sinks.Exceptionless.Internals;
76
using Bing.Text;
@@ -148,6 +147,14 @@ public void Emit(LogEvent logEvent)
148147
builder.AddTags(tagList.Select(x => x.ToString()).ToArray());
149148
}
150149
break;
150+
case ContextDataTypes.CallerInfo when property.Value is ScalarValue callerInfo:
151+
{
152+
var caller = callerInfo.FlattenProperties();
153+
if (caller is null)
154+
continue;
155+
builder.SetProperty("CallerInfo", caller);
156+
}
157+
break;
151158
default:
152159
{
153160
// 特殊处理扩展属性
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
namespace Bing.Logging.Core.Callers
2+
{
3+
/// <summary>
4+
/// 日志调用者信息
5+
/// </summary>
6+
public interface ILogCallerInfo
7+
{
8+
/// <summary>
9+
/// 成员名称(方法名)
10+
/// </summary>
11+
string MemberName { get; }
12+
13+
/// <summary>
14+
/// 文件路径
15+
/// </summary>
16+
string FilePath { get; }
17+
18+
/// <summary>
19+
/// 行号
20+
/// </summary>
21+
int LineNumber { get; }
22+
23+
/// <summary>
24+
/// 转换为参数
25+
/// </summary>
26+
dynamic ToParams();
27+
}
28+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
namespace Bing.Logging.Core.Callers
2+
{
3+
/// <summary>
4+
/// 日志调用者信息
5+
/// </summary>
6+
public readonly struct LogCallerInfo : ILogCallerInfo
7+
{
8+
/// <summary>
9+
/// 初始化一个<see cref="LogCallerInfo"/>类型的实例
10+
/// </summary>
11+
/// <param name="memberName">成员名称(方法名)</param>
12+
/// <param name="filePath">文件路径</param>
13+
/// <param name="lineNumber">行号</param>
14+
public LogCallerInfo(string memberName, string filePath = null, int lineNumber = 0)
15+
{
16+
MemberName = memberName;
17+
FilePath = filePath;
18+
LineNumber = lineNumber;
19+
}
20+
21+
/// <summary>
22+
/// 成员名称(方法名)
23+
/// </summary>
24+
public string MemberName { get; }
25+
26+
/// <summary>
27+
/// 文件路径
28+
/// </summary>
29+
public string FilePath { get; }
30+
31+
/// <summary>
32+
/// 行号
33+
/// </summary>
34+
public int LineNumber { get; }
35+
36+
/// <summary>
37+
/// 转换为参数
38+
/// </summary>
39+
public dynamic ToParams() => new { MemberName, FilePath, LineNumber };
40+
}
41+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
namespace Bing.Logging.Core.Callers
2+
{
3+
/// <summary>
4+
/// 空日志调用者信息
5+
/// </summary>
6+
public struct NullLogCallerInfo : ILogCallerInfo
7+
{
8+
/// <summary>
9+
/// 空日志调用者信息实例
10+
/// </summary>
11+
// ReSharper disable once InconsistentNaming
12+
public static readonly NullLogCallerInfo Instance = new NullLogCallerInfo();
13+
14+
/// <summary>
15+
/// 成员名称(方法名)
16+
/// </summary>
17+
public string MemberName => null;
18+
19+
/// <summary>
20+
/// 文件路径
21+
/// </summary>
22+
public string FilePath => null;
23+
24+
/// <summary>
25+
/// 行号
26+
/// </summary>
27+
public int LineNumber => 0;
28+
29+
/// <summary>
30+
/// 转换为参数
31+
/// </summary>
32+
public dynamic ToParams() => null;
33+
}
34+
}

framework/src/Bing.Logging/Bing/Logging/Core/LogEventContext.cs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
using System.Collections.Generic;
22
using System.Linq;
3+
using Bing.Logging.Core.Callers;
34
using Bing.Logging.ExtraSupports;
5+
using Bing.Utils.Json;
46

57
namespace Bing.Logging.Core
68
{
@@ -106,6 +108,35 @@ public LogEventContext SetExtraProperty(string name, object value)
106108

107109
#endregion
108110

111+
#region CallerInfo
112+
113+
/// <summary>
114+
/// 调用者信息
115+
/// </summary>
116+
private ILogCallerInfo _callerInfo = NullLogCallerInfo.Instance;
117+
118+
/// <summary>
119+
/// 设置调用者信息
120+
/// </summary>
121+
/// <param name="memberName">调用方法名称</param>
122+
/// <param name="sourceFilePath">调用文件路径</param>
123+
/// <param name="sourceLineNumber">调用代码行号</param>
124+
public LogEventContext SetCallerInfo(string memberName = "", string sourceFilePath = "", int sourceLineNumber = 0)
125+
{
126+
if (!string.IsNullOrWhiteSpace(memberName) || !string.IsNullOrWhiteSpace(sourceFilePath) || sourceLineNumber > 0)
127+
{
128+
_callerInfo = new LogCallerInfo(memberName, sourceFilePath, sourceLineNumber);
129+
}
130+
return this;
131+
}
132+
133+
/// <summary>
134+
/// 日志调用者信息
135+
/// </summary>
136+
public ILogCallerInfo LogCallerInfo => _callerInfo;
137+
138+
#endregion
139+
109140
#region ExposeScopeState(公开作用域状态)
110141

111142
/// <summary>
@@ -114,13 +145,18 @@ public LogEventContext SetExtraProperty(string name, object value)
114145
public IDictionary<string, object> ExposeScopeState()
115146
{
116147
var dict = new Dictionary<string, object>();
148+
// 写入标签
117149
if (Tags.Any())
118150
dict[ContextDataTypes.Tags] = Tags;
151+
// 写入扩展属性
119152
if (ExtraProperties.Any())
120153
{
121154
foreach (var kvp in ExtraProperties)
122155
dict.Add(kvp.Key, kvp.Value.Value);
123156
}
157+
// 写入日志调用者信息
158+
if (LogCallerInfo is not NullLogCallerInfo)
159+
dict[ContextDataTypes.CallerInfo] = LogCallerInfo.ToJson();
124160
return dict;
125161
}
126162

framework/src/Bing.Logging/Bing/Logging/Core/LogEventDescriptor.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
namespace Bing.Logging.Core
1+

2+
namespace Bing.Logging.Core
23
{
34
/// <summary>
45
/// 日志事件描述符

framework/src/Bing.Logging/Bing/Logging/ExtraSupports/ContextDataTypes.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,13 @@ public class ContextDataTypes
1111
public const string ExtraProperty = "__BING_EXTRA_PROPERTY_";
1212

1313
/// <summary>
14-
/// 扩展属性
14+
/// 标签列表
1515
/// </summary>
1616
public const string Tags = "__BING_TAGS";
17+
18+
/// <summary>
19+
/// 调用者信息
20+
/// </summary>
21+
public const string CallerInfo = "__BING_CALLER_IFNO";
1722
}
1823
}

framework/src/Bing.Logging/Bing/Logging/ILog.cs

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Runtime.CompilerServices;
23
using Microsoft.Extensions.Logging;
34

45
namespace Bing.Logging
@@ -78,31 +79,49 @@ public interface ILog
7879
/// <summary>
7980
/// 写跟踪日志
8081
/// </summary>
81-
ILog LogTrace();
82+
/// <param name="memberName">方法名</param>
83+
/// <param name="sourceFilePath">文件路径</param>
84+
/// <param name="sourceLineNumber">行号</param>
85+
ILog LogTrace([CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0);
8286

8387
/// <summary>
8488
/// 写调试日志
8589
/// </summary>
86-
ILog LogDebug();
90+
/// <param name="memberName">方法名</param>
91+
/// <param name="sourceFilePath">文件路径</param>
92+
/// <param name="sourceLineNumber">行号</param>
93+
ILog LogDebug([CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0);
8794

8895
/// <summary>
8996
/// 写信息日志
9097
/// </summary>
91-
ILog LogInformation();
98+
/// <param name="memberName">方法名</param>
99+
/// <param name="sourceFilePath">文件路径</param>
100+
/// <param name="sourceLineNumber">行号</param>
101+
ILog LogInformation([CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0);
92102

93103
/// <summary>
94104
/// 写警告日志
95105
/// </summary>
96-
ILog LogWarning();
106+
/// <param name="memberName">方法名</param>
107+
/// <param name="sourceFilePath">文件路径</param>
108+
/// <param name="sourceLineNumber">行号</param>
109+
ILog LogWarning([CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0);
97110

98111
/// <summary>
99112
/// 写错误日志
100113
/// </summary>
101-
ILog LogError();
114+
/// <param name="memberName">方法名</param>
115+
/// <param name="sourceFilePath">文件路径</param>
116+
/// <param name="sourceLineNumber">行号</param>
117+
ILog LogError([CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0);
102118

103119
/// <summary>
104120
/// 写致命日志
105121
/// </summary>
106-
ILog LogCritical();
122+
/// <param name="memberName">方法名</param>
123+
/// <param name="sourceFilePath">文件路径</param>
124+
/// <param name="sourceLineNumber">行号</param>
125+
ILog LogCritical([CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0);
107126
}
108127
}

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

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Collections.Generic;
33
using System.Diagnostics;
44
using System.Linq;
5+
using System.Runtime.CompilerServices;
56
using System.Text;
67
using Bing.Extensions;
78
using Bing.Helpers;
@@ -208,7 +209,7 @@ public virtual ILog Message(string message, params object[] args)
208209
#region LogTrace(写跟踪日志)
209210

210211
/// <inheritdoc />
211-
public virtual ILog LogTrace()
212+
public virtual ILog LogTrace([CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0)
212213
{
213214
try
214215
{
@@ -233,7 +234,7 @@ public virtual ILog LogTrace()
233234
#region LogDebug(写调试日志)
234235

235236
/// <inheritdoc />
236-
public virtual ILog LogDebug()
237+
public virtual ILog LogDebug([CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0)
237238
{
238239
try
239240
{
@@ -258,10 +259,11 @@ public virtual ILog LogDebug()
258259
#region LogInformation(写信息日志)
259260

260261
/// <inheritdoc />
261-
public virtual ILog LogInformation()
262+
public virtual ILog LogInformation([CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0)
262263
{
263264
try
264265
{
266+
CurrentDescriptor.Context.SetCallerInfo(memberName, sourceFilePath, sourceLineNumber);
265267
var scopeDict = CurrentDescriptor.Context.ExposeScopeState();
266268
if (scopeDict.Any())
267269
{
@@ -300,7 +302,7 @@ public virtual ILog LogInformation()
300302
#region LogWarning(写警告日志)
301303

302304
/// <inheritdoc />
303-
public virtual ILog LogWarning()
305+
public virtual ILog LogWarning([CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0)
304306
{
305307
try
306308
{
@@ -325,7 +327,7 @@ public virtual ILog LogWarning()
325327
#region LogError(写错误日志)
326328

327329
/// <inheritdoc />
328-
public virtual ILog LogError()
330+
public virtual ILog LogError([CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0)
329331
{
330332
try
331333
{
@@ -350,7 +352,7 @@ public virtual ILog LogError()
350352
#region LogCritical(写致命日志)
351353

352354
/// <inheritdoc />
353-
public virtual ILog LogCritical()
355+
public virtual ILog LogCritical([CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0)
354356
{
355357
try
356358
{
@@ -390,7 +392,7 @@ protected virtual void AddLogContext()
390392
{
391393
if (LogContext == null)
392394
return;
393-
if(!string.IsNullOrWhiteSpace(LogContext.TraceId))
395+
if (!string.IsNullOrWhiteSpace(LogContext.TraceId))
394396
Property("TraceId", LogContext.TraceId);
395397
if (LogContext.Stopwatch != null)
396398
Property("Duration", LogContext.Stopwatch.Elapsed.Description());
@@ -404,9 +406,9 @@ protected virtual void ConvertStateToContent()
404406
if (LogState == null)
405407
return;
406408
var state = Conv.ToDictionary(LogState);
407-
foreach (var item in state)
409+
foreach (var item in state)
408410
{
409-
if(item.Value.SafeString().IsEmpty())
411+
if (item.Value.SafeString().IsEmpty())
410412
continue;
411413
LogProperties.Add(item);
412414
}

0 commit comments

Comments
 (0)