如何使用EnterpriseLibrary.Logging以UTF-8编码登录

11

我在搜索EnterpriseLibrary.Logging方面有些卡顿。我已经设置了一个监听器和格式化程序,如下所示:

<add name="NormalLogListener"
     type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.RollingFlatFileTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging"
     listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.RollingFlatFileTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging"
     fileName="logs/MVC22.log" 
     footer="" 
     formatter="ShortLogFormatter" 
     header="" 
     rollInterval="Day" 
     timeStampPattern="yyyy-MM-dd" 
     maxArchivedFiles="14" />

...

<add type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging" 
     template="{timestamp(local)} - {severity} - {category} - {message}"
     name="ShortLogFormatter" />

我在多个项目中都使用了这个,它运行得很好。

除了一个问题,我希望EnterpriseLibrary使用UTF-8编码创建我的日志文件(默认情况下我会得到ANSI文件),但不幸的是我不知道如何做到这一点。

我在字符串中有特殊字符,我希望能够将它们记录到我的文件中(例如umlauts);当我将文件转换为UTF-8并让其继续使用时,看起来记录工作正常,但我真的想以这种方式创建它。

这是否可以在XML配置或其他地方完成?

谢谢提前任何帮助!

1个回答

4

开箱即用,我不认为EnterpriseLibrary.Logging应用程序块支持输出到utf-8。它似乎只能输出到默认的ANSI编码。话虽如此,您始终可以编写自己的TraceListener,以输出到utf-8。

未经测试的代码。我快速而草率地编写了它。请注意硬编码的文件路径:

using System;
using System.Text;
using System.Diagnostics;
using Microsoft.Practices.EnterpriseLibrary.Logging;
using Microsoft.Practices.EnterpriseLibrary.Logging.Configuration;
using Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners;
using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;

namespace YourNamespace
{
    [ConfigurationElementType(typeof(CustomTraceListenerData))]
    class UTF8Logging:CustomTraceListener
    {
        public override void TraceData(TraceEventCache eventCache, string source, TraceEventType eventType, int id, object data)
        {
            if (data is LogEntry && this.Formatter != null)
            {
                this.WriteLine(this.Formatter.Format(data as LogEntry));
            }
            else
            {
                this.WriteLine(data.ToString());
            }
        }

        public override void Write(string message)
        {
            this.WriteLine(message);
        }

        public override void WriteLine(string message)
        {
            string fileName = @"C:\Your.log";
            using (StreamWriter sw = new StreamWriter(File.Exists(fileName) ? System.IO.File.Open(fileName, FileMode.Append) : System.IO.File.Create(fileName), Encoding.UTF8))
            {
                Byte[] logMessage = new UTF8Encoding(true).GetBytes(message);
                sw.Write(logMessage,0,logMessage.Length);
            }
        }
    }
}

是的,我也担心这个问题,但我还没有放弃希望 ;) 也许你有一个好的例子? - DrCopyPaste
企业库的版本? - TimWagaman
我会测试一下,但是现在在代码中配置日志文件路径似乎不太好,难道不能从我的xml TraceListener声明中获取路径吗? - DrCopyPaste
同意。就像我说的那样,这只是一个快速而简单的解决方案。我没有看到如何在TraceListener声明中配置路径的示例,但我知道你可以做到。 - TimWagaman
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/27008/discussion-between-timwagaman-and-drcopypaste - TimWagaman
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接