EnyimMemcachedCore 2.1.8
异常信息:
System.AggregateException: An error occurred while writing to logger(s). (Input/output error) ---> System.IO.IOException: Input/output error
at System.ConsolePal.Write(SafeFileHandle fd, Byte* bufPtr, Int32 count)
at System.ConsolePal.Write(SafeFileHandle fd, Byte[] buffer, Int32 offset, Int32 count)
at System.ConsolePal.UnixConsoleStream.Write(Byte[] buffer, Int32 offset, Int32 count)
at System.IO.StreamWriter.Flush(Boolean flushStream, Boolean flushEncoder)
at System.IO.StreamWriter.Write(String value)
at System.IO.SyncTextWriter.Write(String value)
at System.Console.Write(String value)
at Microsoft.Extensions.Logging.Console.ConsoleLogger.AnsiSystemConsole.Write(String message)
at Microsoft.Extensions.Logging.Console.Internal.AnsiLogConsole.Flush()
at Microsoft.Extensions.Logging.Console.Internal.ConsoleLoggerProcessor.WriteMessage(LogMessageEntry message)
at Microsoft.Extensions.Logging.Console.Internal.ConsoleLoggerProcessor.EnqueueMessage(LogMessageEntry message)
at Microsoft.Extensions.Logging.Console.ConsoleLogger.WriteMessage(LogLevel logLevel, String logName, Int32 eventId, String message, Exception exception)
at Microsoft.Extensions.Logging.Console.ConsoleLogger.LogTState
at Microsoft.Extensions.Logging.Logger.LogTState
--- End of inner exception stack trace ---
at Microsoft.Extensions.Logging.Logger.LogTState
at Microsoft.Extensions.Logging.Logger1.Microsoft.Extensions.Logging.ILogger.Log[TState](LogLevel logLevel, EventId eventId, TState state, Exception exception, Func
3 formatter)
at Microsoft.Extensions.Logging.LoggerExtensions.Log(ILogger logger, LogLevel logLevel, EventId eventId, Exception exception, String message, Object[] args)
at Microsoft.Extensions.Logging.LoggerExtensions.LogError(ILogger logger, String message, Object[] args)
at Enyim.Caching.Memcached.MemcachedNode.Acquire()
at Enyim.Caching.Memcached.MemcachedNode.ExecuteOperationAsync(IOperation op)
at Enyim.Caching.Memcached.MemcachedNode.Enyim.Caching.Memcached.IMemcachedNode.ExecuteAsync(IOperation op)
at Enyim.Caching.MemcachedClient.GetAsyncT
---> (Inner Exception #0) System.IO.IOException: Input/output error
at System.ConsolePal.Write(SafeFileHandle fd, Byte* bufPtr, Int32 count)
at System.ConsolePal.Write(SafeFileHandle fd, Byte[] buffer, Int32 offset, Int32 count)
at System.ConsolePal.UnixConsoleStream.Write(Byte[] buffer, Int32 offset, Int32 count)
at System.IO.StreamWriter.Flush(Boolean flushStream, Boolean flushEncoder)
at System.IO.StreamWriter.Write(String value)
at System.IO.SyncTextWriter.Write(String value)
at System.Console.Write(String value)
at Microsoft.Extensions.Logging.Console.ConsoleLogger.AnsiSystemConsole.Write(String message)
at Microsoft.Extensions.Logging.Console.Internal.AnsiLogConsole.Flush()
at Microsoft.Extensions.Logging.Console.Internal.ConsoleLoggerProcessor.WriteMessage(LogMessageEntry message)
at Microsoft.Extensions.Logging.Console.Internal.ConsoleLoggerProcessor.EnqueueMessage(LogMessageEntry message)
at Microsoft.Extensions.Logging.Console.ConsoleLogger.WriteMessage(LogLevel logLevel, String logName, Int32 eventId, String message, Exception exception)
at Microsoft.Extensions.Logging.Console.ConsoleLogger.LogTState
at Microsoft.Extensions.Logging.Logger.LogTState<---
对Enyim APi的封装代码1:
/// <summary>
/// 获取缓存对象
/// </summary>
/// <typeparam name="T">缓存的对象类型</typeparam>
/// <param name="key">缓存key</param>
/// <param name="generator">缓存对象的委托</param>
/// <param name="expire">过期时间</param>
/// <returns></returns>
public static Task<T> Get<T>(string key, Func<Task<T>> generator, TimeSpan? expire = null)
{
return memcachedClient.GetValueOrCreateAsync(key, GetSeconds(expire), generator);
}
调用代码2:
public async Task<List<UserCreditLevelConfigCacheDTO>> GetListCache() {
var systemParamCacheList = await MemcachedHelper.Get(MemcachedConstConfig.CacheKey_UserCreditLevelConfigList,
() => {
//todo
}, MemcachedConstConfig.DefaultExpireTime);
return systemParamCacheList.MapToList<UserCreditLevelConfigCacheDTO>();
}
调用代码3:
var creditLevelItemList = await _userCreditLevelConfigService.GetListCache();
代码片段3中,调用了代码2,代码2中调用了代码1。
这个问题与 EnyimMemcachedCore 无关,是你的环境无法写控制台日志
dudu,我的项目类型是.netcore api。如何修复支持console log呢?
我再看看,目前我的项目部署环境是windows
@Code_Song: 程序运行在什么操作系统上?是什么方式运行的(supervisor, docker...)?日志是如何配置的?为什么不使用 Serilog 而是使用控制台日志?
Windows 的话,控制台日志会被重定向到文件中,建议检查一下 logs 文件夹的权限
@dudu: 程序运行在windows2008(测试环境),自宿主方式运行。项目中的日志方式是用的Nlog,并没有去配置成控制台日志,为什么会去写入控制台呢。
@dudu: 项目中对日志配置了收集到mysql数据库
@Code_Song: 在 web.config 中将 stdoutLogEnabled
设置为 false
@dudu: 现在.netcore类型的,没有web.config文件呢。
刚刚发现了另外的错误,帮助看看
System.ArgumentOutOfRangeException: Unexpected BsonType value: 0
Parameter name: type
at Newtonsoft.Json.Bson.BsonDataReader.ReadType(BsonType type)
at Newtonsoft.Json.Bson.BsonDataReader.ReadNormal()
at Newtonsoft.Json.Bson.BsonDataReader.Read()
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject(Object newObject, JsonReader reader, JsonObjectContract contract, JsonProperty member, String id)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateList(IList list, JsonReader reader, JsonArrayContract contract, JsonProperty containerProperty, String id)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateList(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, Object existingValue, String id)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)
at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType)
at Newtonsoft.Json.JsonSerializer.DeserializeT
at Enyim.Caching.Memcached.DefaultTranscoder.DeserializeT
at Enyim.Caching.MemcachedClient.BuildGetCommandResultT
at Enyim.Caching.MemcachedClient.GetAsyncT
@Code_Song: 将 EnyimMemcachedCore 升级到最新版可解决这个问题
@dudu: 好的
@dudu: 最新版本的Nuget包,可以和memache1.5版本一起工作吗
@Code_Song: 可以,那个问题已经修复
@dudu: ok,谢谢
@dudu:
Enyim.Caching.MemcachedClient|GetAsync("AdminMenuList") System.AggregateException: An error occurred while writing to logger(s). (Input/output error) ---> System.IO.IOException: Input/output error
at System.ConsolePal.Write(SafeFileHandle fd, Byte* bufPtr, Int32 count)
at System.ConsolePal.Write(SafeFileHandle fd, Byte[] buffer, Int32 offset, Int32 count)
at System.ConsolePal.UnixConsoleStream.Write(Byte[] buffer, Int32 offset, Int32 count)
at System.IO.StreamWriter.Flush(Boolean flushStream, Boolean flushEncoder)
at System.IO.StreamWriter.Write(String value)
at System.IO.SyncTextWriter.Write(String value)
at System.Console.Write(String value)
at Microsoft.Extensions.Logging.Console.ConsoleLogger.AnsiSystemConsole.Write(String message)
at Microsoft.Extensions.Logging.Console.Internal.AnsiLogConsole.Flush()
at Microsoft.Extensions.Logging.Console.Internal.ConsoleLoggerProcessor.WriteMessage(LogMessageEntry message)
at Microsoft.Extensions.Logging.Console.Internal.ConsoleLoggerProcessor.EnqueueMessage(LogMessageEntry message)
at Microsoft.Extensions.Logging.Console.ConsoleLogger.WriteMessage(LogLevel logLevel, String logName, Int32 eventId, String message, Exception exception)
at Microsoft.Extensions.Logging.Console.ConsoleLogger.LogTState
at Microsoft.Extensions.Logging.Logger.LogTState
--- End of inner exception stack trace ---
at Microsoft.Extensions.Logging.Logger.LogTState
at Microsoft.Extensions.Logging.Logger1.Microsoft.Extensions.Logging.ILogger.Log[TState](LogLevel logLevel, EventId eventId, TState state, Exception exception, Func
3 formatter)
at Microsoft.Extensions.Logging.LoggerExtensions.Log(ILogger logger, LogLevel logLevel, EventId eventId, Exception exception, String message, Object[] args)
at Enyim.Caching.Memcached.MemcachedNode.InternalPoolImpl.MarkAsDead()
at Enyim.Caching.Memcached.MemcachedNode.InternalPoolImpl.ReleaseSocket(PooledSocket socket)
at Enyim.Caching.Memcached.MemcachedNode.ExecuteOperationAsync(IOperation op)
at Enyim.Caching.Memcached.MemcachedNode.Enyim.Caching.Memcached.IMemcachedNode.ExecuteAsync(IOperation op)
at Enyim.Caching.MemcachedClient.GetAsyncT
---> (Inner Exception #0) System.IO.IOException: Input/output error
at System.ConsolePal.Write(SafeFileHandle fd, Byte* bufPtr, Int32 count)
at System.ConsolePal.Write(SafeFileHandle fd, Byte[] buffer, Int32 offset, Int32 count)
at System.ConsolePal.UnixConsoleStream.Write(Byte[] buffer, Int32 offset, Int32 count)
at System.IO.StreamWriter.Flush(Boolean flushStream, Boolean flushEncoder)
at System.IO.StreamWriter.Write(String value)
at System.IO.SyncTextWriter.Write(String value)
at System.Console.Write(String value)
at Microsoft.Extensions.Logging.Console.ConsoleLogger.AnsiSystemConsole.Write(String message)
at Microsoft.Extensions.Logging.Console.Internal.AnsiLogConsole.Flush()
at Microsoft.Extensions.Logging.Console.Internal.ConsoleLoggerProcessor.WriteMessage(LogMessageEntry message)
at Microsoft.Extensions.Logging.Console.Internal.ConsoleLoggerProcessor.EnqueueMessage(LogMessageEntry message)
at Microsoft.Extensions.Logging.Console.ConsoleLogger.WriteMessage(LogLevel logLevel, String logName, Int32 eventId, String message, Exception exception)
at Microsoft.Extensions.Logging.Console.ConsoleLogger.LogTState
at Microsoft.Extensions.Logging.Logger.LogTState<---
@dudu: 这个是我把应用Enyim Memcached包的项目发布到CentOS服务器上之后,看到的错误日志
env.ConfigureNLog("NLog.config");
app.UseEnyimMemcached();
项目的配置是这样的,参考的Demo来的。
@Code_Song: 试试禁用控制台日志
@dudu: 我看Nlog.Config里面,并没有配置Console类型的日志输出呢
为什么输出到控制台,会影响Enyim.Memcache包的程序?
<target xsi:type="File" name="allfile" fileName="${basedir}/logs/nlog-all-${shortdate}.log"
layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}" />
<target xsi:type="File" name="ownFile-web" fileName="${basedir}/logs/nlog-own-${shortdate}.log"
layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" />
<!--收集异常日志到mysql数据库-->
<target xsi:type="Database" name="database" dbProvider="MySql.Data.MySqlClient.MySqlConnection, MySql.Data"
@dudu: 谢谢dudu,我再观察一下看看,这个异常很怪异。再有问题,我把调用和发生的场景提到git上
@Code_Song: 控制台日志是默认就启用的,可以在 Program.cs 中添加下面的代码代码移除控制台日志
.ConfigureLogging((context, logging) =>
{
logging.ClearProviders();
});
@dudu: 好的
能看下有关使用EnyimMemcachedCore的代码吗?
– hellotim 5年前@hellotim: ok。我再完善一下问题详情
– Code_Song 5年前@hellotim: 单步的调试都没有什么问题,但是我在收集的错误日志中,发现有这样的异常错误。不知所以
– Code_Song 5年前