2

ReSharper 7.1.1、NUnit 2.6.0、および log4net 1.2.10 を使用しています。

私の log4net 構成には、RollingFileAppender があります。

<appender name="file" type="log4net.Appender.RollingFileAppender">
    <file type="log4net.Util.PatternString" value="%appdomain.log" />
    <appendToFile value="true" />
    <rollingStyle value="Size" />
    <maxSizeRollBackups value="0" />
    <maximumFileSize value="5MB" />
    <staticLogFileName value="true" />
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%utcdate{ISO8601} %-5level - %message%newline" />
    </layout>
    <threshold value="ALL" />
</appender>

単体テスト コードを実行すると、次のエラーが発生します。

log4net:ERROR XmlHierarchyConfigurator: Could not create Appender [file] of type [log4net.Appender.RollingFileAppender]. Reported error follows.
System.NotSupportedException: The given path's format is not supported.
   at System.Security.Util.StringExpressionSet.CanonicalizePath(String path, Boolean needFullPath)
   at System.Security.Util.StringExpressionSet.CreateListFromExpressions(String[] str, Boolean needFullPath)
   at System.Security.Permissions.FileIOPermission.AddPathList(FileIOPermissionAccess access, AccessControlActions control, String[] pathListOrig, Boolean checkForDuplicates, Boolean needFullPath, Boolean copyPathList)
   at System.IO.Path.GetFullPath(String path)
   at log4net.Util.SystemInfo.ConvertToFullPath(String path)
   at log4net.Appender.RollingFileAppender.ActivateOptions()
   at log4net.Repository.Hierarchy.XmlHierarchyConfigurator.ParseAppender(XmlElement appenderElement)

これは、log4net の%appdomain値が AppDomain.CurrentDomain.FriendlyName の値から取得されるためです。

IsolatedAppDomainHost: MyProject.Tests

この AppDomain 名にはコロンが含まれているため、ファイル名に変換できません。つまり、%は次のようにappdomain.logなります。IsolatedAppDomainHost: MyProject.Tests.log

回避策の提案を探しています:

  • 単体テスト プロジェクトのためだけに、AppDomain の値を何らかの方法でオーバーライドできますか?
  • log4net.Util.PatternStringコロンを削除するように変更できますか?
  • この問題を回避するために ReSharper テストランナーを構成できますか?
  • これは、使用しているツールの新しいバージョンで修正されていますか? 他の場所でこの問題についての言及は見つかりませんでした。

そうでない場合は、Gallio または log4net のいずれかにプル リクエストを送信してみることができます。

ありがとう!

4

2 に答える 2

2

これは私のために働いた:

public class SafeRollingFileAppender : log4net.Appender.RollingFileAppender
{
    public override string File
    {
        get { return base.File; }
        set 
        {
            //remove that pesky colon
            string newValue = value.Replace(":", "");

            //now do some general purpose cleanup
            string dir = Path.GetDirectoryName(newValue);
            string file = Path.GetFileName(newValue);

            string dirRegexSearch = new string(Path.GetInvalidPathChars());
            Regex dr = new Regex(string.Format("[{0}]", Regex.Escape(dirRegexSearch)));
            string newDir = dr.Replace(dir, "");

            string fileRegexSearch = new string(Path.GetInvalidFileNameChars());
            Regex fr = new Regex(string.Format("[{0}]", Regex.Escape(fileRegexSearch)));
            string newFile = fr.Replace(file, "");

            base.File = Path.Combine(newDir, newFile);
        }
    }
}
于 2013-07-22T22:53:58.623 に答える
2

Can I modify the log4net.Util.PatternString so that it strips out the colon?

Probably not a good idea as this could end up striping out colons in other places.

You could download the log4net source code and add some validation on the file property, but if you don't want to do that, you could implement your own Appender which overrides the File property , something like

public class SaferRollingFileAppender : log4net.Appender.RollingFileAppender
{     
    virtual public string File
    {
        get { return base.File ; }
        set { base.File = value.Replace(":",""); }
    }
}

Would obviously be better if this fully validated the name rather than just checking for the colon. (Originally thought that it would be a matter of removing all Path.GetInvalidFileNameChars() and Path.GetInvalidPathChars() characters, but it's not as simple as that, so I leave that as an exercise for the reader.)

Downside would be that anything that uses your class needs to be able to find the assembly it is contained it.

于 2013-02-19T15:17:01.820 に答える