学堂 学堂 学堂公众号手机端

C#服务器使用log4net输出日志,Unity客户端自动输出日志

lewis 4年前 (2021-10-09) 阅读数 4 #技术


欢迎加入Unity业内qq交流群:956187480




一:服务器

1.要保证VisualStudio已经装了NuGet包,然后在包管理里面搜索log4net并下载安装

2.搜索到了以后下载安装,第一次安装的时候会很耗时间,预计十几分钟。我当时还以为是环境问题mmd

3.装好了以后引用里面就会有

4.配置文件的编写,不会没关系网上一大堆,放进工程里面并设置属性:始终复制

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
</configSections>
<log4net>
<root>
<level value="All"/>
<appender-ref ref="RollingLogFileAppender"/>
<appender-ref ref="ConsoleAppender"/>
</root>

<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="log\logfile.log"/>
<appendToFile value="true"/>
<Encoding value="UTF-8" />
<!--按日期产生文件夹,文件名[在日期方式与混合方式下使用]日志文件名格式为:2008-08-31.log -->
<param name= "DatePattern" value= "yyyy-MM-dd".log""/>
<!--log保留天数-->
<param name= "MaxSizeRollBackups" value= "10"/>
<!--日志文件名是否是固定不变的(是否只写到一个文件中)-->
<param name= "StaticLogFileName" value= "false"/>
<!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])-->
<param name="RollingStyle" value="Date" />
<!--每个文件的大小。只在混合方式与文件大小方式下使用,超出大小的在文件名后自动增加1重新命名-->
<param name="maximumFileSize" value="500KB" />
<layout type="log4net.Layout.PatternLayout">
<!--
%d, %date :表示当然的时间
   %p, %level :表示日志的级别
   %c, %logger :表示日志产生的主题或名称,通常是所在的类名,便于定位问题
   %m, %message :表示日志的具体内容
   %n, %newline :换行
%exception :表示异常信息
-->
<param name="ConversionPattern" value="%d [%t] %-5p %c - %m %logger %n" />
</layout>
</appender>

<!-- 控制台显示日志 -->
<appender name="ConsoleAppender" type="log4net.Appender.ColoredConsoleAppender">
<!-- 设置不同级别控制台显示的不同颜色 -->
<mapping>
<level value="INFO" />
<foreColor value="Green" />
</mapping>
<mapping>
<level value="DEBUG" />
<foreColor value="White" />
</mapping>
<mapping>
<level value="WARN" />
<foreColor value="Yellow" />
</mapping>
<mapping>
<level value="ERROR" />
<foreColor value="Red, HighIntensity" />
</mapping>
<!-- 记录的格式。 -->
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date{HH:mm:ss,fff} [%-5level] %m %n" />
</layout>
<!--
过滤器type有如下几种类型
log4net.Filter.DenyAllFilter 丢弃所有日志事件。
log4net.Filter.LevelMatchFilter 准确匹配事件等级。
log4net.Filter.LevelRangeFilter 匹配一个范围的等级。
log4net.Filter.LoggerMatchFilter 匹配一个日志器名字的开始。
log4net.Filter.PropertyFilter 匹配指定属性名称的子字符串。
log4net.Filter.StringMatchFilter 匹配事件消息的子字符串。
-->
<filter type="log4net.Filter.LevelRangeFilter">
<!-- 控制输出日志的级别范围 -->
<param name="LevelMin" value="DEBUG" />
<param name="LevelMax" value="Error" />
</filter>
</appender>
</log4net>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2"/>
</startup>
</configuration>

5.Debug类的封装

using log4net;
using log4net.Config;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;

public static class Debug
{
private static ILog m_Log;
static Debug()
{
XmlConfigurator.ConfigureAndWatch(new FileInfo(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile));
m_Log = LogManager.GetLogger(typeof(Debug));
}

public static void Log(object message)
{
m_Log.Debug(message);
}

public static void Log(string format, params object[] args)
{
m_Log.DebugFormat(format, args);
}

public static void LogInfo(object message)
{
m_Log.Info(message);
}

public static void LogInfo(string format, params object[] args)
{
m_Log.InfoFormat(format, args);
}

public static void LogWarn(object message)
{
m_Log.Warn(message);
}

public static void LogWarn(string format, params object[] args)
{
m_Log.WarnFormat(format, args);
}

public static void LogError(object message)
{
m_Log.Error(message);
}

public static void LogError(string format, params object[] args)
{
m_Log.ErrorFormat(format, args);
}

public static void LogFatle(object message)
{
m_Log.Fatal(message);
}

public static void LogFatle(string format, params object[] args)
{
m_Log.FatalFormat(format, args);
}
}

6.最重要的一步,添加标签

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", ConfigFileExtension = "config", Watch = true)]

7.调用debug之后就会在目标路径下生产一个log日志文件

Debug.LogInfo("服务器{0}启动监听成功", m_ListenSocket.LocalEndPoint.ToString());


二:客户端

把一下脚本挂在实例上即可,具体的log输出路径可自己配置

#region 模块信息
// **********************************************************************
// Please contact me if you have any questions
// File Name: WriteLog
// Author: 幻世界
// **********************************************************************
#endregion
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Text;
using UnityEngine;
using Debug = UnityEngine.Debug;

public class WriteLog : MonoBehaviour
{
private static FileStream FileWriter;
private static UTF8Encoding encoding;
private void Start()
{
//gameObject.AddComponent<ShowConsole>();
//gameObject.AddComponent<FPS>();
LogStart();
}
public void LogStart()
{
Debug.LogError("开始写入日志");
Debug.Log(Application.persistentDataPath);
if (!Directory.Exists(Application.persistentDataPath + "/Log"))
{
Directory.CreateDirectory(Application.persistentDataPath + "/Log");
}

string NowTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss").Replace(" ", "_").Replace("/", "_").Replace(":", "_");
FileInfo fileInfo = new FileInfo(Application.persistentDataPath + "/Log/" + NowTime + "_Log.txt");
//设置Log文件输出地址
FileWriter = fileInfo.Open(FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read);
encoding = new UTF8Encoding();
Application.logMessageReceived += LogCallback;
}
/// <summary>
/// Log回调
/// </summary>
/// <param name="condition">输出内容</param>
/// <param name="stackTrace">堆栈追踪</param>
/// <param name="type">Log日志类型</param>
private void LogCallback(string condition, string stackTrace, LogType type) //写入控制台数据
{
//输出的日志类型可以自定义
string content = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " " + "【" + type + "】" + "【" + stackTrace + "】" + ":" + condition + Environment.NewLine + Environment.NewLine;
FileWriter.Write(encoding.GetBytes(content), 0, encoding.GetByteCount(content));
FileWriter.Flush();
}

private void OnDestroy() //关闭写入
{
if ((FileWriter != null))
{
Debug.LogError("日志写入结束");
FileWriter.Close();
Application.logMessageReceived -= LogCallback;
}
}
}

欢迎加入Unity业内qq交流群:956187480


版权声明

本文仅代表作者观点,不代表博信信息网立场。

热门