我通过log4net设置了数据库日志记录。我得到相同的时间戳,没有异常对象。
Appender:
<appender name="AsyncDBAppender" type="DA.Systems.Focus.Shared.LogCore.AsynchronousAdoNetAppender, Focus-Shared-LogCore">
<bufferSize value="1" />
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="data source=dbServer;initial catalog=dbName;persist security info=True;user id=username;password=password;MultipleActiveResultSets=True;Connect Timeout=360;App=log4net" />
<commandText value="INSERT INTO [dbo].[MainLog] ([ProjectId], [ApplicationId], [MachineName],[OperationId], [UserId], [Date], [Thread] ,[Level], [Logger], [Message], [Exception])
VALUES (1, 2, @machineName, @operationId, @userId, @logDate, @thread, @logLevel, @logger, @message, @exception)" />
<parameter>
<parameterName value="@machineName" />
<dbType value="String" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%property{log4net:HostName}" />
</layout>
</parameter>
<parameter>
<parameterName value="@operationId" />
<dbType value="String" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%property{OperationId}" />
</layout>
</parameter>
<parameter>
<parameterName value="@userId" />
<dbType value="String" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%property{UserId}" />
</layout>
</parameter>
<parameter>
<parameterName value="@logDate" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>
<parameter>
<parameterName value="@thread" />
<dbType value="String" />
<size value="32" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%t" />
</layout>
</parameter>
<parameter>
<parameterName value="@logLevel" />
<dbType value="String" />
<size value="512" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%p" />
</layout>
</parameter>
<parameter>
<parameterName value="@logger" />
<dbType value="String" />
<size value="512" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%c" />
</layout>
</parameter>
<parameter>
<parameterName value="@message" />
<dbType value="String" />
<size value="4000" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%m" />
</layout>
</parameter>
<parameter>
<parameterName value="@exception" />
<dbType value="String" />
<size value="4000" />
<layout type="log4net.Layout.ExceptionLayout" />
</parameter>
</appender>
问题:
按日期排序将破坏实际序列。模式为log4net.Layout.RawTimeStampLayout
,数据库列为Datetime2
当有异常时,异常本身未记录
爆炸代码:
try
{
InfoScope($"{LayerName} -> {callerInfo.MethodName} -> Passes bill created. Notifying Security-System...", userId, operationId);
var notificationResult = await _securitySystem.FocusBillPaymentNotification(billInfoBdo.BillDetails, userId, operationId);
if (notificationResult.Result)
{
InfoScope($"{LayerName} -> {callerInfo.MethodName} -> Notifying Security-System succeeded: Security-System Receipt #{notificationResult.SecuritySystemReceiptNumber}, Message: {notificationResult.Message}", userId, operationId);
}
else
{
WarnScope($"{LayerName} -> {callerInfo.MethodName} -> Notifying Security-System failed: {notificationResult.Message}", userId, operationId);
}
}
catch (Exception exp)
{
ErrorScope($"{LayerName} -> {callerInfo.MethodName} -> Exception at Security-System Payment notification [{exp.Message}]", exp, userId, operationId);
}
如何使时间戳更精确?
为什么异常pobject无法获取.ToString()/ logged?
这里是我使用的记录核心:
#region Error
[DebuggerStepThrough]
protected void ErrorScope(string message, string userId, Guid operationId)
{
SetUserId(userId);
SetOperationId(operationId);
Logger.ErrorFormat(message);
}
[DebuggerStepThrough]
protected void ErrorScope(string message, Exception exception, Guid operationId)
{
SetOperationId(operationId);
Logger.ErrorFormat(message, exception.GetInnerExceptions());
}
[DebuggerStepThrough]
protected void ErrorScope(string message, Exception exception, string userId, Guid operationId)
{
SetUserId(userId);
ErrorScope(message, exception, operationId);
}
#endregion
嗯,这不是直接解决此问题的方法,但是我确实设法以另一种方式获得了正确的时间戳:我在数据库中添加了另一列,其类型为DateTime2
,默认为SysDateTime()
:
RecordStamp DATETIME2 NOT NULL CONSTRAINT DF_MainLog_RecordStamp DEFAULT (SYSDATETIME())
现在,此列负责确保每个日志条目都带有有效的时间戳。