我正在使用 EntLib 6 来记录一个 Web 应用程序。因为我使用的是 n 层,所以我想将日志记录放在一个库中,可以从所有层访问。
我正在尝试运行日志记录,但没有任何反应,所有代码都在运行,没有异常,但数据库中没有出现任何内容。
这就是我所做的:我已经使用 EntLib6 中提供的脚本创建了数据库,该数据库位于
DB_BELVAL
连接字符串下方,我将此 C# 测试代码放入将处理日志记录的可移植类中:
public static void LogToDatabase()
{
try
{
//Bootstrapping logging
DatabaseFactory.SetDatabaseProviderFactory(new DatabaseProviderFactory());
IConfigurationSource configurationSource = ConfigurationSourceFactory.Create();
LogWriterFactory logWriterFactory = new LogWriterFactory(configurationSource);
Logger.SetLogWriter(logWriterFactory.Create());
if (Logger.IsLoggingEnabled())
{
LogEntry log = GetLogEntry();
log.Categories.Add("General"); // name of Categorie in EntLib Config editor
log.Priority = 5;
log.Severity = System.Diagnostics.TraceEventType.Information;
log.Message = "Hello dude, from AMLogger";
Logger.Write(log);
}
}
catch (Exception ex)
{
}
}
private static LogEntry GetLogEntry()
{
LogEntry log = new LogEntry();
log.TimeStamp = DateTime.Now;
log.Title = "TANOLIS";
log.Priority = 5; // default priority
log.Severity = System.Diagnostics.TraceEventType.Verbose; // default severity
log.MachineName = "MachineName";//HttpContext.Current.Server.MachineName;
log.ProcessId = System.Diagnostics.Process.GetCurrentProcess().Id.ToString();
return log;
}
从 UnitTest 中,我调用可移植库的 LogToDatabase() 方法。 我将单元测试的配置文件配置为:
或 xml:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="loggingConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.LoggingSettings, Microsoft.Practices.EnterpriseLibrary.Logging, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="true" />
<section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="true" />
</configSections>
<loggingConfiguration name="" tracingEnabled="true" defaultCategory="General">
<listeners>
<add name="Database Trace Listener" type="Microsoft.Practices.EnterpriseLibrary.Logging.Database.FormattedDatabaseTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging.Database, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Database.Configuration.FormattedDatabaseTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging.Database, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
databaseInstanceName="DB_Belval" writeLogStoredProcName="WriteLog"
addCategoryStoredProcName="General" formatter="Text Formatter" />
</listeners>
<formatters>
<add type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
template="Timestamp: {timestamp}{newline}
Message: {message}{newline}
Category: {category}{newline}
Priority: {priority}{newline}
EventId: {eventid}{newline}
Severity: {severity}{newline}
Title:{title}{newline}
Machine: {localMachine}{newline}
App Domain: {localAppDomain}{newline}
ProcessId: {localProcessId}{newline}
Process Name: {localProcessName}{newline}
Thread Name: {threadName}{newline}
Win32 ThreadId:{win32ThreadId}{newline}
Extended Properties: {dictionary({key} - {value}{newline})}"
name="Text Formatter" />
</formatters>
<categorySources>
<add switchValue="All" name="General">
<listeners>
<add name="Database Trace Listener" />
</listeners>
</add>
</categorySources>
<specialSources>
<allEvents switchValue="All" name="All Events">
<listeners>
<add name="Database Trace Listener" />
</listeners>
</allEvents>
<notProcessed switchValue="All" name="Unprocessed Category">
<listeners>
<add name="Database Trace Listener" />
</listeners>
</notProcessed>
<errors switchValue="All" name="Logging Errors & Warnings">
<listeners>
<add name="Database Trace Listener" />
</listeners>
</errors>
</specialSources>
</loggingConfiguration>
<dataConfiguration defaultDatabase="DB_Belval" />
<connectionStrings>
<add name="DB_Belval" connectionString="Data Source=serverIP;Initial Catalog=APP_Dev;Persist Security Info=True;User=login;Password=password"
providerName="System.Data.SqlClient" />
</connectionStrings>
</configuration>
确实,什么也没发生,但我在 UnitTest 上设置了断点,一切看起来都正确,无一例外。
谢谢你帮助我
**编辑 1 : **: logWriterFactory 看起来已经加载了 XML:
编辑2:我编辑了存储过程[dbo].[WriteLog],以便制作一种标志(一个INSERT INTO [dbo].[TestLog])来知道存储过程是否被调用并且它看起来该应用程序不会调用存储过程:
ALTER PROCEDURE [dbo].[WriteLog]
(
@EventID int,
@Priority int,
@Severity nvarchar(32),
@Title nvarchar(256),
@Timestamp datetime,
@MachineName nvarchar(32),
@AppDomainName nvarchar(512),
@ProcessID nvarchar(256),
@ProcessName nvarchar(512),
@ThreadName nvarchar(512),
@Win32ThreadId nvarchar(128),
@Message nvarchar(1500),
@FormattedMessage ntext,
@LogId int OUTPUT
)
AS
INSERT INTO [dbo].[TestLog]
([text]) VALUES ('Storeproc1')
INSERT INTO [dbo].[Log] (
EventID,
Priority,
Severity,
Title,
[Timestamp],
MachineName,
AppDomainName,
ProcessID,
ProcessName,
ThreadName,
Win32ThreadId,
Message,
FormattedMessage
)
VALUES (
@EventID,
@Priority,
@Severity,
@Title,
@Timestamp,
@MachineName,
@AppDomainName,
@ProcessID,
@ProcessName,
@ThreadName,
@Win32ThreadId,
@Message,
@FormattedMessage)
SET @LogID = @@IDENTITY
RETURN @LogID
当我启动 UnitTest 时,[dbo].[TestLog] 中没有新行,因此问题似乎出在 C# 中
看起来你已经花了一些时间撕扯你的头发了。我的两分钱是收集尽可能多的调试信息。我之前没有任何 EL 经验。
这是我的建议;
我建议您监视目标数据库上的所有交易/请求。为此,只需从 SSMS 打开 SQL 事件探查器并运行它,除了数据库名称(或在整个服务器上)之外不使用任何过滤器。顺便问一下,它是本地数据库还是远程数据库? 如果是远程,请过滤您的用户名,以避免其他开发人员/用户的鼻子。
检查是否有缺少DLL或EL抛出的加载异常。使用融合日志。如果需要,我可以为您提供有关如何使用它的信息。
从 MS SDK 工具(C:\Program Files (x86)\Microsoft SDKs\Windows 10.0A in\NETFX 4.6 Tools)运行 Fuslogvw.exe 实用程序,采用最高版本。 以管理员身份运行以编辑 Fusion 的设置(将自定义日志路径设置为“C:\Fuslog”) 创建目录“C:\Fuslog”(必须存在才能启用日志记录)。 完成后禁用融合。
您还可以启用“.NET Framework Source Stepping”,但下载符号需要一些时间。
如果您选择这个,请确保通过显示符号窗口为 EL 正确加载符号。
随时通知我们!