log4net:ERROR无法创建类型为[log4net.Appender.ColoredConsoleAppender



你好,朋友,我在控制台应用程序的net core中尝试使用log4net时遇到了以下问题。

我的代码是:

using log4net;
using log4net.Config;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Threading.Tasks;
using Teltonika.Codec;
namespace UdpListener
{
class Program
{
private static readonly ILog Log = LogManager.GetLogger(typeof(Program));
static void Main()
{
XmlConfigurator.Configure();
IPAddress ip;
if (!IPAddress.TryParse(ConfigurationManager.AppSettings["ipAddress"], out ip))
{
Log.Error("Ip is not valid.");
throw new ArgumentException("Ip is not valid.");
}
int port;
if (!int.TryParse(ConfigurationManager.AppSettings["port"], out port))
{
Log.Error("Port is not valid.");
throw new ArgumentException("Port is not valid.");
}
Task.Run(async () =>
{
try
{
using (var udpClient = new UdpClient(new IPEndPoint(ip, port)))
{
Log.Info("Listening...");
while (true)
{
//IPEndPoint object will allow us to read datagrams sent from any source.
var receivedResults = await udpClient.ReceiveAsync();
byte[] data = receivedResults.Buffer;

//tramaService.InsertTrama(new Entity.GpsPuntos()
//{
//    Fecha = DateTime.Now,
//    Trama = String.Join("", data.Select(x => x.ToString("X2")).ToArray())
//});

Log.Info(string.Format("Received connection from: {0}", receivedResults.RemoteEndPoint));
Log.Info(string.Format("{0} - received [{1}]", DateTime.Now, String.Join("", data.Select(x => x.ToString("X2")).ToArray())));
var reader = new ReverseBinaryReader(new MemoryStream(data));
// Decode data
var avlData = new DataDecoder(reader).DecodeUdpData();
// Create response
var bytes = new List<byte>();
const short packetLength = 2 /* Id */+ 1 /* Type */ + 1 /* Avl packet id */+ 1 /* num of accepted elems */;
bytes.AddRange(BitConverter.GetBytes(BytesSwapper.Swap(packetLength)));
bytes.AddRange(BitConverter.GetBytes(BytesSwapper.Swap(avlData.PacketId)));
bytes.Add(avlData.PacketType);
bytes.Add(avlData.AvlPacketId);
bytes.Add((byte)avlData.AvlData.DataCount);
var response = bytes.ToArray();
Log.Info(string.Format("{0} - response [{1}]", DateTime.Now, String.Join("", bytes.Select(x => x.ToString("X2")).ToArray())));
await udpClient.SendAsync(response, response.Length, receivedResults.RemoteEndPoint);
}
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
});
Console.ReadLine();
}
}
}

这是我的错误

log4net:ERROR无法创建类型为[log4net.Appender.ColoredConsoleAppender]的Appender[Console]。报告的错误如下。System.NotSupportedException:没有可用于编码850的数据。有关定义自定义编码的信息,请参阅encoding.RegisterProvider方法的文档。在System.Text.Encoding.GetEncoding(Int32代码页(位于log4net.Appender.ColoredConsoleAppender.ActivateOptions((位于log4net.Repository.Herarchy.XmlHierarchyConfigurator.ParseAppender(XmlElement appenderElement(log4net:ERROR未找到名为[Console]的追加程序。

我的档案配置:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<appSettings>
<add key="ipAddress" value="172.17.160.1"/>
<add key="port" value="3316"/>
<!--<add key="log4net.Internal.Debug" value="true"/>-->
</appSettings>
<log4net>
<appender name="Console" type="log4net.Appender.ColoredConsoleAppender" Target="Console.Error">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger - %message%newline"/>
</layout>
</appender>

<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="log.txt"/>
<appendToFile value="true"/>
<rollingStyle value="Size"/>
<maxSizeRollBackups value="10"/>
<maximumFileSize value="500KB"/>
<staticLogFileName value="true"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%d %-5p %c %m%n"/>
</layout>
</appender>
<root>
<level value="INFO"/>
<appender-ref ref="Console"/>
<appender-ref ref="RollingFileAppender"/>
</root>
</log4net>
</configuration>

我希望它在控制台应用程序中向我显示它正在工作。

从.NET Framework升级到.NET 5后,我今天也遇到了同样的错误。我设法绕过了它,在我的程序开始时添加了以下行:

System.Text.Encoding.RegisterProvider(
System.Text.CodePagesEncodingProvider.Instance);

对我来说,这是通过使用ManagedColoredConsoleAppender解决的。

如果您想在除Windows之外的其他操作系统上运行应用程序,使用ManagedColoredConsoleAppender是一个更好的解决方案。

ColoredConsoleAppender依赖kernel32.dll,而ManagedColoredConsoleAppeder不依赖。

另请参阅https://issues.apache.org/jira/browse/LOG4NET-658.

最新更新