change - 修改扫码器触发模式

collectionStore
liuwf 1 year ago
parent 3cf05e4d25
commit e1ec93aad1

@ -1,4 +1,5 @@
using Aucma.Scada.HikRobot;
using Aucma.Core.Scanner;
using Aucma.Scada.HikRobot;
using Aucma.Scada.Model.domain;
using HighWayIot.Config;
using HighWayIot.Log4net;
@ -38,7 +39,7 @@ namespace Aucma.Scada.Business
private InStoreTaskHandle taskHandle = InStoreTaskHandle.Instance;
private GrabImage grabImage = GrabImage.Instance;
#endregion
@ -98,8 +99,8 @@ namespace Aucma.Scada.Business
taskHandle.InStoreFinsihEvent += InStoreFinish;
taskHandle.InStoreAnswerEvent += InStoreAnswer;
grabImage.RefreshMaterialCodeStrEvent += InStore;
grabImage.RefreshLogMessageEvent += PrintLogInfoMessage;
MvCodeHelper.RefreshMaterialCodeStrEvent += InStore;
MvCodeHelper.RefreshLogMessageEvent += PrintLogInfoMessage;
StartPassDown();
@ -205,7 +206,6 @@ namespace Aucma.Scada.Business
private void StartPassDown()
{
Thread.Sleep(5000);
Task.Run(() =>
{
while (true)

@ -405,7 +405,7 @@ namespace Aucma.Scada.Business
private void RealReadPlcSpace()
{
Thread.Sleep(5000);
Thread.Sleep(1000);
Task.Run(() =>
{
while (true)

@ -1,7 +1,9 @@
using Aucma.Scada.HikRobot;
using Aucma.Core.Scanner;
using Aucma.Scada.HikRobot;
using HighWayIot.Config;
using HighWayIot.Plc;
using System;
using System.Threading;
using System.Threading.Tasks;
namespace Aucma.Scada.Business
@ -29,7 +31,7 @@ namespace Aucma.Scada.Business
private PlcPool plcPool = PlcPool.Instance;
private GrabImage grabImage = GrabImage.Instance;
#endregion
private MainBusiness()
@ -61,12 +63,14 @@ namespace Aucma.Scada.Business
public void InitHikRobot()
{
try
{
grabImage.InitHikRobot();
{
MvCodeHelper.DeviceListAcq();//获取创建设备
MvCodeHelper.StartGrab(); // 开启触发扫码接收数据
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
MvCodeHelper.CloseAllDevice();
InitHikRobot();
}
}
@ -77,7 +81,7 @@ namespace Aucma.Scada.Business
{
try
{
grabImage.ExitHikRobot();
MvCodeHelper.CloseAllDevice();
}
catch (Exception ex)
{

@ -68,7 +68,7 @@ namespace Aucma.Scada.Business
private IRecordProductfinishService _recordProductfinishService;
private ICodeBindingRecordServices _codeBindingRecordServices;
#endregion
#region 委托事件
@ -113,7 +113,7 @@ namespace Aucma.Scada.Business
_productPlanInfoService = registerServices.GetService<IProductPlanInfoService>();
_recordOutStoreService = registerServices.GetService<IRecordOutStoreService>();
_recordProductfinishService = registerServices.GetService<IRecordProductfinishService>();
_codeBindingRecordServices = registerServices.GetService<ICodeBindingRecordServices>();
assemblyPlanBusiness.NextPassExecutePlanInfoEvent += PlanHandle;
taskHandleBusiness.OutStoreAnswerEvent += OutStoreAnswer;
taskHandleBusiness.OutStoreFinsihEvent += OutStoreFinish;
@ -143,11 +143,7 @@ namespace Aucma.Scada.Business
RealTaskInfo shellTask = OutStore(appConfig.shellStoreCode, shellBomInfo, planInfo.executePlanCode, taskCode);
Thread.Sleep(500);
RealTaskInfo linerTask = OutStore(appConfig.linerStoreCode, linerBomInfo, planInfo.executePlanCode, taskCode);
// 条码绑定表,绑定箱壳和内胆码 shellTask.materialCode,linerTask.materialCode
if (shellTask != null && linerTask != null)
{
_codeBindingRecordServices.BindingCode(shellTask.materialCode, linerTask.materialCode);
}
Thread.Sleep(500);
}

@ -2,6 +2,7 @@
using HighWayIot.Config;
using HighWayIot.Log4net;
using HighWayIot.Plc;
using HighWayIot.Repository.service;
using System;
using System.Collections.Generic;
using System.Linq;
@ -37,6 +38,8 @@ namespace Aucma.Scada.Business
private PlcPool _pool = PlcPool.Instance;
private PlcSpaceConfig spaceConfig = PlcSpaceConfig.Instance;
private RegisterServices registerServices = RegisterServices.Instance;
private ICodeBindingRecordServices _codeBindingRecordServices;
#endregion
#region 私有变量
@ -83,6 +86,7 @@ namespace Aucma.Scada.Business
private OutStoreTaskHandle()
{
_codeBindingRecordServices = registerServices.GetService<ICodeBindingRecordServices>();
_plcDictionary = _pool.GetAll();
RealReadShellFinish();
@ -481,7 +485,9 @@ namespace Aucma.Scada.Business
if (shellTask != null && linerTask != null)
{
Console.WriteLine($"绑定箱壳:{shellTask.materialCode};内胆:{linerTask.materialCode};条码");
logHelper.Info($"绑定条码:箱壳:{shellTask.materialCode};内胆:{linerTask.materialCode}");
// 条码绑定表,绑定箱壳和内胆码 shellTask.materialCode,linerTask.materialCode
_codeBindingRecordServices.BindingCode(shellTask.materialCode, linerTask.materialCode);
shellTaskInfos.Remove(shellTask);
linerTaskInfos.Remove(linerTask);

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ProjectView>ShowAllFiles</ProjectView>
</PropertyGroup>
</Project>

@ -10,19 +10,21 @@ using static System.Runtime.CompilerServices.RuntimeHelpers;
using HighWayIot.Log4net;
using HighWayIot.Config;
using System.Security.Policy;
namespace Aucma.Core.Scanner
{
public class MvCodeHelper
{
private AppConfig appConfig = AppConfig.Instance;
private static AppConfig appConfig = AppConfig.Instance;
public static bool m_bGrabbing = true;
private LogHelper logHelper = LogHelper.Instance;
#region 委托事件
public delegate void RefreshMaterialCodeStr(string storeCode, string materialCodeStr);
public event RefreshMaterialCodeStr RefreshMaterialCodeStrEvent;
public static event RefreshMaterialCodeStr RefreshMaterialCodeStrEvent;
/// <summary>
/// 日志信息刷新
/// </summary>
/// <param name="message"></param>
public delegate void RefreshLogMessage(string message);
public static event RefreshLogMessage RefreshLogMessageEvent;
#endregion
// 获取到的所有设备
@ -59,24 +61,25 @@ namespace Aucma.Core.Scanner
/// <summary>
/// 获取并创建设备列表
/// </summary>
public void DeviceListAcq()
public static void DeviceListAcq()
{
try
{
logHelper.Info("获取扫码器设备列表,进入DeviceListAcq()方法");
RefreshLogMessageEvent?.Invoke("获取扫码器设备列表,进入DeviceListAcq()方法");
System.GC.Collect();
m_stDeviceList.nDeviceNum = 0;
// 获取设备列表
int nRet = MvCodeReader.MV_CODEREADER_EnumDevices_NET(ref m_stDeviceList, MvCodeReader.MV_CODEREADER_GIGE_DEVICE);
if (0 != nRet)
{
logHelper.Info("获取扫码器列表失败,扫码器错误码:" + nRet);
RefreshLogMessageEvent?.Invoke("获取扫码器列表失败,扫码器错误码:" + nRet);
return;
}
if (0 == m_stDeviceList.nDeviceNum)
{
logHelper.Info("获取扫码器数量为0请检查扫码器连接:");
RefreshLogMessageEvent?.Invoke("获取扫码器数量为0请检查扫码器连接:");
return;
}
@ -93,33 +96,32 @@ namespace Aucma.Core.Scanner
// 获取ip
string ip = ((stGigEDeviceInfo.nCurrentIp & 0xff000000) >> 24) + "." + ((stGigEDeviceInfo.nCurrentIp & 0x00ff0000) >> 16) + "." + ((stGigEDeviceInfo.nCurrentIp & 0x0000ff00) >> 8) + "." + (stGigEDeviceInfo.nCurrentIp & 0x000000ff);
// Console.WriteLine($"打印扫码设备信息,下标:{i}IP{ip}");
logHelper.Info("扫码器设备[" + i + "],ip:" + ip);
// Console.WriteLine($"打印扫码设备信息,下标:{i}IP{ip}");
Console.Write("扫码器设备[" + i + "],ip:" + ip);
// 创建第i个设备
stDevInfo = (MvCodeReader.MV_CODEREADER_DEVICE_INFO)Marshal.PtrToStructure(m_stDeviceList.pDeviceInfo[i], typeof(MvCodeReader.MV_CODEREADER_DEVICE_INFO));
nRet = m_cMyDevice.MV_CODEREADER_CreateHandle_NET(ref stDevInfo);//创建设备
if (MvCodeReader.MV_CODEREADER_OK != nRet)
{
logHelper.Error("创建第" + i + "个扫码器设备失败,ip:" + ip);
Console.WriteLine("创建第" + i + "个扫码器设备失败,ip:" + ip);
return;
}
logHelper.Info("创建第" + i + "个扫码器设备成功,ip:" + ip);
}
// 打开设备
nRet = m_cMyDevice.MV_CODEREADER_OpenDevice_NET();
if (MvCodeReader.MV_CODEREADER_OK != nRet)
{
m_cMyDevice.MV_CODEREADER_DestroyHandle_NET();
logHelper.Error("Device open fail!");
Console.WriteLine("Device open fail!");
return;
}
RefreshLogMessageEvent?.Invoke("创建并打开第" + i + "个扫码器设备成功,ip:" + ip);
//设置触发模式
nRet = m_cMyDevice.MV_CODEREADER_SetEnumValue_NET("TriggerMode", (uint)MvCodeReader.MV_CODEREADER_TRIGGER_MODE.MV_CODEREADER_TRIGGER_MODE_ON);
if (MvCodeReader.MV_CODEREADER_OK != nRet)
{
logHelper.Error("Set TriggerMode On Fail!");
Console.WriteLine("设置触发模式失败");
return;
}
//添加到集合
m_cMyDevices.Add(m_cMyDevice, ip);
}
@ -127,14 +129,14 @@ namespace Aucma.Core.Scanner
}
catch (Exception ex)
{
logHelper.Error("获取和创建设备异常:" + ex);
Console.WriteLine("获取和创建设备异常:" + ex);
}
}
#endregion
#region 光电触发扫码器接收条码处理业务
public void StartGrab()
public static void StartGrab()
{
try
{
@ -166,7 +168,7 @@ namespace Aucma.Core.Scanner
{
// string strCode = System.Text.Encoding.Default.GetString(stBcrResult.stBcrInfoEx2[i].chCode);
string strCode = Encoding.UTF8.GetString(stBcrResult.stBcrInfoEx2[i].chCode);
logHelper.Info("bIsValidUTF8:: Get CodeNum: " + "CodeNum[" + i.ToString() + "], CodeString[" + strCode.Trim().TrimEnd('\0') + "]");
// logHelper.Info("bIsValidUTF8:: Get CodeNum: " + "CodeNum[" + i.ToString() + "], CodeString[" + strCode.Trim().TrimEnd('\0') + "]");
}
else
{
@ -176,7 +178,7 @@ namespace Aucma.Core.Scanner
Array.Copy(stBcrResult.stBcrInfoEx2[i].chCode, buffer, 22);
}
string strCode = Encoding.GetEncoding("UTF-8").GetString(buffer).Trim().TrimEnd('\0');
logHelper.Info("相机ip:" + hashmap.Value + " Get CodeNum: " + "CodeNum[" + i.ToString() + "], CodeString[" + strCode + "]");
RefreshLogMessageEvent?.Invoke("相机ip:" + hashmap.Value + " Get CodeNum: " + "CodeNum[" + i.ToString() + "], CodeString[" + strCode + "]");
if (!string.IsNullOrEmpty(strCode))
{
// 获取到条码处理业务
@ -199,18 +201,18 @@ namespace Aucma.Core.Scanner
}
catch (Exception ex)
{
logHelper.Error("扫码异常:" + ex);
Console.WriteLine("扫码异常:" + ex);
}
}
#endregion
#region 关闭所有设备
public void CloseAllDevice()
public static void CloseAllDevice()
{
try
{
logHelper.Info("开始关闭所有设备");
Console.WriteLine("开始关闭所有设备");
int nRet = MvCodeReader.MV_CODEREADER_OK;
// 关闭所有已打开相机
foreach (KeyValuePair<MvCodeReader, string> hashmap in m_cMyDevices)
@ -219,14 +221,14 @@ namespace Aucma.Core.Scanner
nRet = hashmap.Key.MV_CODEREADER_StopGrabbing_NET();
if (MvCodeReader.MV_CODEREADER_OK != nRet)
{
logHelper.Error("设备ip:" + hashmap.Value + "停止抓图失败");
Console.WriteLine("设备ip:" + hashmap.Value + "停止抓图失败");
Console.WriteLine("Stop grabbing failed{0:x8}", nRet);
}
// ch:关闭设备 | en:Close device
nRet = hashmap.Key.MV_CODEREADER_CloseDevice_NET();
if (MvCodeReader.MV_CODEREADER_OK != nRet)
{
logHelper.Error("设备ip:" + hashmap.Value + "关闭失败");
Console.WriteLine("设备ip:" + hashmap.Value + "关闭失败");
}
@ -234,14 +236,14 @@ namespace Aucma.Core.Scanner
nRet = hashmap.Key.MV_CODEREADER_DestroyHandle_NET();
if (MvCodeReader.MV_CODEREADER_OK != nRet)
{
logHelper.Error("设备ip:" + hashmap.Value + "销毁失败");
Console.WriteLine("设备ip:" + hashmap.Value + "销毁失败");
}
logHelper.Error("设备ip:" + hashmap.Value + "关闭成功!");
Console.WriteLine("设备ip:" + hashmap.Value + "关闭成功!");
}
}
catch (Exception ex)
{
logHelper.Error("设备关闭异常:" + ex);
Console.WriteLine("设备关闭异常:" + ex);
}
@ -258,7 +260,7 @@ namespace Aucma.Core.Scanner
nRet = hashmap.Key.MV_CODEREADER_StopGrabbing_NET();
if (MvCodeReader.MV_CODEREADER_OK != nRet)
{
logHelper.Error("设备ip:" + hashmap.Value + "停止抓图失败");
Console.WriteLine("设备ip:" + hashmap.Value + "停止抓图失败");
Console.WriteLine("Stop grabbing failed{0:x8}", nRet);
return;
}
@ -266,13 +268,13 @@ namespace Aucma.Core.Scanner
nRet = hashmap.Key.MV_CODEREADER_CloseDevice_NET();
if (MvCodeReader.MV_CODEREADER_OK != nRet)
{
logHelper.Error("设备ip:" + hashmap.Value + "关闭失败");
Console.WriteLine("设备ip:" + hashmap.Value + "关闭失败");
return;
}
}
catch (Exception ex)
{
logHelper.Error("设备关闭异常:" + ex);
Console.WriteLine("设备关闭异常:" + ex);
}
}
#endregion

@ -0,0 +1,67 @@
<?xml version="1.0" encoding="utf-8"?>
<log4net>
<!-- 将日志以回滚文件的形式写到文件中 -->
<!-- 按日期切分日志文件,并将日期作为日志文件的名字 -->
<!--Error-->
<appender name="ErrorLog" type="log4net.Appender.RollingFileAppender">
<!--不加utf-8编码格式中文字符将显示成乱码-->
<param name="Encoding" value="utf-8" />
<file value="Log\"/>
<appendToFile value="true" />
<rollingStyle value="Date" />
<!--日期的格式,每天换一个文件记录,如不设置则永远只记录一天的日志,需设置-->
<datePattern value='yyyy-MM-dd/"error.txt"' />
<!--日志文件名是否为静态-->
<StaticLogFileName value="false"/>
<!--多线程时采用最小锁定-->
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<!--布局(向用户显示最后经过格式化的输出信息)-->
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date| %-5level %newline%message%newline--------------------------------%newline" />
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="ERROR" />
<levelMax value="FATAL" />
</filter>
</appender>
<!--Error-->
<!--Info-->
<appender name="InfoLog" type="log4net.Appender.RollingFileAppender">
<!--不加utf-8编码格式中文字符将显示成乱码-->
<param name="Encoding" value="utf-8" />
<!--定义文件存放位置-->
<!--<file value="../../../Log/"/>-->
<file value="Log\"/>
<appendToFile value="true" />
<rollingStyle value="Date" />
<!--日志文件名是否为静态-->
<StaticLogFileName value="false"/>
<!--日期的格式,每天换一个文件记录,如不设置则永远只记录一天的日志,需设置-->
<!--<datePattern value="&quot;GlobalInfoLogs_&quot;yyyyMMdd&quot;.log&quot;" />-->
<datePattern value='yyyy-MM-dd/"LogInfo.txt"' />
<!--多线程时采用最小锁定-->
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<!--布局(向用户显示最后经过格式化的输出信息)-->
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date| %-5level%c %newline%message%newline--------------------------------%newline" />
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="DEBUG" />
<levelMax value="WARN" />
</filter>
</appender>
<!--Info-->
<root>
<!-- 控制级别由低到高ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF -->
<!-- 比如定义级别为INFO则INFO级别向下的级别比如DEBUG日志将不会被记录 -->
<!-- 如果没有定义LEVEL的值则缺省为DEBUG -->
<level value="ALL" />
<!-- 按日期切分日志文件,并将日期作为日志文件的名字 -->
<appender-ref ref="ErrorLog" />
<appender-ref ref="InfoLog" />
</root>
</log4net>

@ -0,0 +1,153 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
</configSections>
<appSettings>
</appSettings>
<log4net>
<!--错误日志类-->
<logger name="logerror">
<level value="ALL" />
<appender-ref ref="ErrorAppender" />
</logger>
<!--信息日志类-->
<logger name="loginfo">
<level value="ALL" />
<appender-ref ref="InfoAppender" />
</logger>
<!--PLC日志类-->
<logger name="plclog">
<level value="ALL" />
<appender-ref ref="PlcAppender" />
</logger>
<!--RFID日志类-->
<logger name="rfidlog">
<level value="ALL" />
<appender-ref ref="RfidAppender" />
</logger>
<!--RFID日志类-->
<logger name="viewlog">
<level value="ALL" />
<appender-ref ref="ViewAppender" />
</logger>
<!--Sql日志类-->
<logger name="sqllog">
<level value="ALL" />
<appender-ref ref="SqlAppender" />
</logger>
<!--信号量日志类-->
<logger name="semaphorelog">
<level value="ALL" />
<appender-ref ref="SemaphoreAppender" />
</logger>
<!--错误日志附加介质-->
<appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value="Log\" />
<param name="AppendToFile" value="true" />
<param name="MaxSizeRollBackups" value="100" />
<param name="MaxFileSize" value="10240" />
<param name="StaticLogFileName" value="false" />
<param name="DatePattern" value='yyyy-MM-dd/"LogError.html"'/>
<param name="RollingStyle" value="Date" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="&lt;HR COLOR=red&gt;%n异常时间%d [%t] &lt;BR&gt;%n异常级别%-5p &lt;BR&gt;%n异 常 类:%c [%x] &lt;BR&gt;%n%m &lt;BR&gt;%n &lt;HR Size=1&gt;" />
</layout>
</appender>
<!--信息日志附加介质-->
<appender name="InfoAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value="Log\" />
<param name="AppendToFile" value="true" />
<param name="MaxFileSize" value="10240" />
<param name="MaxSizeRollBackups" value="100" />
<param name="StaticLogFileName" value="false" />
<param name="DatePattern" value='yyyy-MM-dd/"LogInfo.txt"' />
<param name="RollingStyle" value="Date" />
<!--信息日志布局-->
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="&lt;--------------&gt;%n日志时间%d [%t] %n日志级别%-5p %n日志内容%m %n " />
</layout>
</appender>
<!--PLC日志附加介质-->
<appender name="PlcAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value="Log\" />
<param name="AppendToFile" value="true" />
<param name="MaxFileSize" value="10240" />
<param name="MaxSizeRollBackups" value="100" />
<param name="StaticLogFileName" value="false" />
<param name="DatePattern" value='yyyy-MM-dd/"PlcLog.txt"' />
<param name="RollingStyle" value="Date" />
<!--信息日志布局-->
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="&lt;--------------&gt;%n日志时间%d [%t] %n日志级别%-5p %n日志内容%m %n " />
</layout>
</appender>
<!--Rfid日志附加介质-->
<appender name="RfidAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value="Log\" />
<param name="AppendToFile" value="true" />
<param name="MaxFileSize" value="10240" />
<param name="MaxSizeRollBackups" value="100" />
<param name="StaticLogFileName" value="false" />
<param name="DatePattern" value='yyyy-MM-dd/"RfidLog.txt"' />
<param name="RollingStyle" value="Date" />
<!--信息日志布局-->
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="&lt;--------------&gt;%n日志时间%d [%t] %n日志级别%-5p %n日志内容%m %n " />
</layout>
</appender>
<appender name="ViewAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value="Log\" />
<param name="AppendToFile" value="true" />
<param name="MaxFileSize" value="10240" />
<param name="MaxSizeRollBackups" value="100" />
<param name="StaticLogFileName" value="false" />
<param name="DatePattern" value='yyyy-MM-dd/"ViewLog.txt"' />
<param name="RollingStyle" value="Date" />
<!--信息日志布局-->
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="&lt;--------------&gt;%n日志时间%d [%t] %n日志级别%-5p %n日志内容%m %n " />
</layout>
</appender>
<appender name="SqlAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value="Log\" />
<param name="AppendToFile" value="true" />
<param name="MaxFileSize" value="10240" />
<param name="MaxSizeRollBackups" value="100" />
<param name="StaticLogFileName" value="false" />
<param name="DatePattern" value='yyyy-MM-dd/"SqlLog.txt"' />
<param name="RollingStyle" value="Date" />
<!--信息日志布局-->
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="&lt;--------------&gt;%n日志时间%d [%t] %n日志级别%-5p %n日志内容%m %n " />
</layout>
</appender>
<appender name="SemaphoreAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value="Log\" />
<param name="AppendToFile" value="true" />
<param name="MaxFileSize" value="10240" />
<param name="MaxSizeRollBackups" value="100" />
<param name="StaticLogFileName" value="false" />
<param name="DatePattern" value='yyyy-MM-dd/"SemaphoreLog.txt"' />
<param name="RollingStyle" value="Date" />
<!--信息日志布局-->
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="&lt;--------------&gt;%n日志时间%d [%t] %n日志级别%-5p %n日志内容%m %n " />
</layout>
</appender>
</log4net>
</configuration>
Loading…
Cancel
Save