3

NLog 2.0 のラッパーとして Common.Logging を使用します。これは、将来 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>

問題は、テーブルに何も挿入されていないことです。たとえば HomeController のインデックス ページにロガーを配置し、logger.Error("an error") を呼び出すと、テーブルにレコードが追加されます。

誰か助けてくれませんか?

4

2 に答える 2

0

作成したLogMethodAttributeでコントローラーメソッドを装飾していますか?

また、ロガールールを調整して、「エラー」以外のレベルを追加することもできます。そうしないと、ログに記録されるのはそれだけです。

これを試してみてください:

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

編集:

ロガーの初期化をメソッドに移動してみましたか?

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

Donald BelchamのPluralsightコースによると、アスペクトコンストラクターは実行時に実行されないため、ロガーが適切に設定されていない可能性があります。

于 2013-01-30T01:50:49.650 に答える
0

クラス Aspect に静的プロパティ ロガーを追加します。

public class LogAspect : OnMethodBoundaryAspect
{
    /// <summary>
    /// Gets or sets the logger.
    /// </summary>
    public static ILogger logger { get; set; }

ILogger クラスを使用してアプリケーションの init メソッドでロガー変数を設定し、AttributeExclude を使用してこの初期化の前にすべてのメソッドを除外します。

    [LogAspect(AttributeExclude = true)]
    protected void Application_Start()
    {
        _windsorContainer = new WindsorContainer();
        ApplicationDependencyInstaller.RegisterLoggingFacility(_windsorContainer);
        LogAspect.logger = _windsorContainer.Resolve<ILogger>();
于 2013-03-13T22:16:26.483 に答える