我正在使用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
我正在寻找一些解决方法的建议:
log4net.Util.PatternString
以便它删除冒号吗?如果没有,我可以尝试向Gallio或log4net提交拉取请求 - 虽然在这种情况下我不确定哪个“有问题”?
谢谢!
答案 0 :(得分:2)
我可以修改log4net.Util.PatternString以便删除冒号吗?
可能不是一个好主意,因为这可能最终会在其他地方删除冒号。
您可以下载log4net源代码并在文件属性上添加一些验证,但如果您不想这样做,您可以实现自己的Appender,它会覆盖File属性,例如
public class SaferRollingFileAppender : log4net.Appender.RollingFileAppender
{
virtual public string File
{
get { return base.File ; }
set { base.File = value.Replace(":",""); }
}
}
如果这完全验证了名称而不仅仅是检查冒号,显然会更好。 (最初认为这将是删除所有Path.GetInvalidFileNameChars()和Path.GetInvalidPathChars()字符的问题,但它不是那么简单,所以我把它作为读者的练习。)
缺点是任何使用你的类的东西都需要能够找到包含它的程序集。
答案 1 :(得分: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);
}
}
}