Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通用。使用PostSharp和NLog 2.0进行日志记录_C#_Nlog_Postsharp_Common.logging - Fatal编程技术网

C# 通用。使用PostSharp和NLog 2.0进行日志记录

C# 通用。使用PostSharp和NLog 2.0进行日志记录,c#,nlog,postsharp,common.logging,C#,Nlog,Postsharp,Common.logging,我使用Common.Logging作为NLOG2.0的包装。我这样做是为了将来可以用另一个日志提供商替换NLog 我还使用PostSharp在每次需要时都不编写try-catch块。我有一个继承OnMethodBoundaryAspect的类: [Serializable] public class LogMethodAttribute : OnMethodBoundaryAspect { private ILog logger; public LogMethodAttribu

我使用Common.Logging作为NLOG2.0的包装。我这样做是为了将来可以用另一个日志提供商替换NLog

我还使用PostSharp在每次需要时都不编写try-catch块。我有一个继承OnMethodBoundaryAspect的类:

[Serializable]
public class LogMethodAttribute : OnMethodBoundaryAspect
{
    private ILog logger;

    public LogMethodAttribute()
    {
        this.logger = LogManager.GetCurrentClassLogger();
    }

    public override void OnEntry(MethodExecutionArgs args)
    {
        logger.Debug(string.Format("Entering {0}.{1}.", args.Method.DeclaringType.Name, args.Method.Name));
    }

    public override void OnExit(MethodExecutionArgs args)
    {
        logger.Debug(string.Format("Leaving {0}.{1}.", args.Method.DeclaringType.Name, args.Method.Name));
    }

    public override void OnException(MethodExecutionArgs args)
    {
        logger.Error(args.Exception.Message,args.Exception);
    }
}
我在我的web.config中配置了Common.Logging,如下所示:

<configSections>
<sectionGroup name="common">
  <section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging" />
</sectionGroup>
</configSections>
<common>
<logging>
  <factoryAdapter type="Common.Logging.NLog.NLogLoggerFactoryAdapter, Common.Logging.NLog20">
    <arg key="configType" value="FILE" />
    <arg key="configFile" value="~/NLog.config" />
  </factoryAdapter>
</logging>
</common>

NLog.Config如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  throwExceptions="true"
  internalLogLevel="Debug"
  internalLogToConsoleError="true"
  internalLogFile="c:\new projects/nlog-app.txt"
>

<!-- 
See http://nlog-project.org/wiki/Configuration_file 
for information on customizing logging rules and outputs.
 -->
<targets>
<target name="database"
        xsi:type="Database"
        commandText="INSERT INTO LogEvent(EventDateTime, EventLevel, UserName, MachineName, EventMessage, ErrorSource, ErrorClass, ErrorMethod, ErrorMessage, InnerErrorMessage) VALUES(@EventDateTime, @EventLevel, @UserName, @MachineName, @EventMessage, @ErrorSource, @ErrorClass, @ErrorMethod, @ErrorMessage, @InnerErrorMessage)"

        dbProvider="System.Data.SqlClient">
  <connectionString>
    Data Source=...;Initial Catalog=myDB;User Id=user;Password=pass;
  </connectionString>
  <installConnectionString>
     Data Source=...;Initial Catalog=myDB;User Id=user;Password=pass;
  </installConnectionString>

    <!-- parameters for the command -->
  <parameter name="@EventDateTime" layout="${date:s}" />
  <parameter name="@EventLevel" layout="${level}" />
  <parameter name="@UserName" layout="${identity}" />
  <parameter name="@MachineName" layout="${machinename}" />
  <parameter name="@EventMessage" layout="${message}" />
  <parameter name="@ErrorSource" layout="${event-context:item=error-source}" />
  <parameter name="@ErrorClass" layout="${event-context:item=error-class}" />
  <parameter name="@ErrorMethod" layout="${event-context:item=error-method}" />
  <parameter name="@ErrorMessage" layout="${event-context:item=error-message}" />
  <parameter name="@InnerErrorMessage" layout="${event-context:item=inner-error-message}" />
  <!-- commands to install database -->
  <install-command>
    <text>CREATE DATABASE myDB</text>
    <connectionString> Data Source=...;Initial Catalog=myDB;User Id=user;Password=pass;</connectionString>
    <ignoreFailures>true</ignoreFailures>
  </install-command>

  <install-command>
    <text>
      CREATE TABLE LogEvent(
      EventId int primary key not null identity(1,1),
      EventDateTime datetime,
      EventLevel nvarchar(50),
      UserName nvarchar(50),
      MachineName nvarchar(1024),
      EventMessage nvarchar(MAX),
      ErrorSource nvarchar(1024),
      ErrorClass nvarchar(1024),
      ErrorMethod nvarchar(1024),
      ErrorMessage nvarchar(MAX),
      InnerErrorMessage nvarchar(MAX));
    </text>
  </install-command>

  <!-- commands to uninstall database -->
  <uninstall-command>
    <text>DROP DATABASE myDB</text>
    <connectionString> Data Source=...;Initial Catalog=myDB;User Id=user;Password=pass;</connectionString>
    <ignoreFailures>true</ignoreFailures>
  </uninstall-command>

</target>
</targets>

<rules>
<logger name="*" levels="Error" writeTo="database" />
</rules>
</nlog>

数据源=。。。;初始目录=myDB;用户Id=用户;密码=通过;
数据源=。。。;初始目录=myDB;用户Id=用户;密码=通过;
创建数据库myDB
数据源=。。。;初始目录=myDB;用户Id=用户;密码=通过;
真的
创建表日志事件(
EventId int主键非空标识(1,1),
EventDateTime日期时间,
事件级别nvarchar(50),
用户名nvarchar(50),
MachineName nvarchar(1024),
事件消息nvarchar(最大值),
ErrorSource nvarchar(1024),
错误等级nvarchar(1024),
ErrorMethod nvarchar(1024),
错误消息nvarchar(最大值),
InnerErrorMessage nvarchar(最大值);
删除数据库myDB
数据源=。。。;初始目录=myDB;用户Id=用户;密码=通过;
真的
问题是没有在我的表中插入任何内容。当我把一个记录器放在索引页上,例如我的HomeController中,我调用我的logger.Error(“错误”),它会将一条记录添加到我的表中


有人能帮我吗?

您是否正在使用您创建的LogMethodAttribute装饰控制器方法

此外,您还需要调整记录器规则,使其包含“Error”之外的更多级别,否则您将只记录这些级别

尝试一下:

<rules>
<logger name="*" minLevel="Trace" writeTo="database" />
</rules>

根据Donald Belcham的Pluralsight课程,方面构造函数不会在运行时执行,因此可能您的记录器设置不正确。

在类方面中添加静态属性记录器

public class LogAspect : OnMethodBoundaryAspect
{
    /// <summary>
    /// Gets or sets the logger.
    /// </summary>
    public static ILogger logger { get; set; }
公共类LogAspect:OnMethodBoundaryAspect
{
/// 
///获取或设置记录器。
/// 
公共静态ILogger记录器{get;set;}
使用ILogger类在应用程序init方法中设置logger变量,并在此初始化之前使用AttributeExclude排除所有方法

    [LogAspect(AttributeExclude = true)]
    protected void Application_Start()
    {
        _windsorContainer = new WindsorContainer();
        ApplicationDependencyInstaller.RegisterLoggingFacility(_windsorContainer);
        LogAspect.logger = _windsorContainer.Resolve<ILogger>();
[LogAspect(AttributeExclude=true)]
受保护的无效应用程序\u Start()
{
_windsorContainer=新windsorContainer();
ApplicationDependencyInstaller.RegisterLoggingFacility(_windsorContainer);
LogAspect.logger=\u windsorContainer.Resolve();

我对NLog一无所知,但这行代码看起来可疑;
this.logger=LogManager.GetCurrentClassLogger();
。在这种情况下,不会得到一个与方面类相关的“logger”,而不是修饰类吗?“logger”会很好,它只会用当前类名命名。是的,我已经用LogMethodAttribute修饰了我的方法。我只需要在这种特殊情况下记录我的错误,所以只需在错误级别上记录就可以了。@JurgenVandw:对不起,我想我还是在试图理解你的问题……你是说如果你在控制器方法中手动放置logger.Error(),它会工作,但是onetry/OnExit不工作?你正在将onetry/OnExit记录到调试级别,并且你还没有指定在哪里写入调试消息。如果你手动使用logger.debug()它会工作吗在你的控制器方法中?除非你在这里漏掉了一些代码,否则不应该这样做……请不要对几个问题给出完全相同的答案。如果同一个答案适用于多个问题,这是一个很好的迹象,这些问题是重复的。你应该标记(或关闭,如果你有足够的声誉),而不是回答。
    [LogAspect(AttributeExclude = true)]
    protected void Application_Start()
    {
        _windsorContainer = new WindsorContainer();
        ApplicationDependencyInstaller.RegisterLoggingFacility(_windsorContainer);
        LogAspect.logger = _windsorContainer.Resolve<ILogger>();