linux 运行.net 5,.NET跨平台之旅:在Linux上将ASP.NET 5运行日志写入文件

在前一篇博文(增加文件日志功能遇到的挫折)中,我们遇到了这样一个问题:日志组件(比如Serilog, NLog) Core,但目前只支持控制台输出日志,不支持将日志写入文件;这就意味着我们在Linux上运行的5站点无法将日志写入文件,给排查问题造成很大的麻烦,比如现在示例站点经常挂掉的问题。

面对这个问题我们没有善罢甘休,跨平台之旅的步伐,我们要解决它,而且希望先用简单的方法解决,不想从头实现一个日志组件。

在上一篇博文发布后,一位同事给出了这样一个提示:既然Serilog记录日志时是直接将日志信息写入控制台的输出流( .WriteTo.TextWriter(Console.Out) ),那么应该也可以用它写入文件的写入流,都是Stream嘛。

好主意!可行!但有一个前提是corefx中的文件操作类库要支持Linux,也就是System.IO.FileSystem实现了跨平台。

Core中的文件操作类库是否已经跨平台了呢?我们的文件日志问题是否可以通过它解决呢?码一下,就会知道。

于是将Startup.cs中的 .WriteTo.TextWriter(Console.Out) 改为下面的代码:

.WriteTo.TextWriter(new StreamWriter(logFilePath))

运行 dnx kestrel 命令却出现下面的错误:

DNXCore,Version=v5.0 error CS1503: Argument 1: cannot convert from 'string' to 'System.IO.Stream'

出现这个错误是因为corefx中实现的StreamWriter的构造函数不支持文件路径作为参数,.NET Framework中是支持的。所以需要修改一下代码,将FileStream类型的参数传递给StreamWriter的构造函数,代码如下:

.WriteTo.TextWriter(new StreamWriter(new FileStream(logFilePath, FileMode.OpenOrCreate)))

这样改了之后,站点成功启动。

Logging to /data/git/AboutUs/logs/log.txt

Hosting environment: Production

Now listening on: http://*:8001

Application started. Press Ctrl+C to shut down.

然后用浏览器访问一下站点,并用tail命令看一下日志是否成功写入到了日志文件中?

# tail log.txt

11/22/2015 14:08:58 +08:00 [Debug] The view '"Intro"' was found.

11/22/2015 14:08:58 +08:00 [Information] Executing ViewResult, running view at path "/Views/About/Intro.cshtml".

11/22/2015 14:08:58 +08:00 [Information] User profile is available. Using '"/root/.aspnet/DataProtection-Keys"' as key repository; keys will not be encrypted at rest.

11/22/2015 14:09:01 +08:00 [Debug] Data Source=xxx

11/22/2015 14:09:03 +08:00 [Information] Microsoft.Data.Entity.Storage.DbCommandLogData

11/22/2015 14:09:03 +08:00 [Debug] Data Source=xxx

11/22/2015 14:09:03 +08:00 [Information] Executed action "CNBlogs.AboutUs.Web.AboutController.Intro" in 0.6192ms

11/22/2015 14:09:03 +08:00 [Information] Request finished in 0.6196ms 200 text/html; charset=utf-8

11/22/2015 14:09:16 +08:00 [Error] Connection id "4" disconnected.

11/22/2015 14:09:16 +08:00 [Error] Connection id "3" disconnected.

成功! 5站点的运行日志到文件的问题就这么临时解决了。

顺便分享一下目前Startup.cs中的最新代码:

usingSystem;usingSystem.IO;usingSystem.Linq;usingMicrosoft.AspNet.Builder;usingMicrosoft.Extensions.DependencyInjection;usingMicrosoft.Data.Entity;usingCNBlogs.AboutUs.Data;usingMicrosoft.Dnx.Runtime;usingMicrosoft.Extensions.PlatformAbstractions;usingMicrosoft.Extensions.Configuration;usingSystem.Data.SqlClient;usingMicrosoft.Extensions.Logging;usingSerilog;namespaceCNBlogs.AboutUs.Web

{public classStartup

{publicStartup(IApplicationEnvironment appEnv)

{

IConfigurationBuilder builder= newConfigurationBuilder()

.SetBasePath(appEnv.ApplicationBasePath)

.AddJsonFile("config.json", false);

Configuration=builder.Build();var logFilePath = bine(appEnv.ApplicationBasePath,"logs/log.txt");

Console.WriteLine("Logging to"+logFilePath);

Log.Logger= newLoggerConfiguration()

.MinimumLevel.Debug()

.WriteTo.TextWriter(newStreamWriter(newFileStream(logFilePath, FileMode.OpenOrCreate)))

.CreateLogger();

}public IConfiguration Configuration { get; set; }public voidConfigure(IApplicationBuilder app, ILoggerFactory loggerFactory)

{

loggerFactory

.AddSerilog()

.AddConsole();

app.UseDeveloperExceptionPage();

app.UseMvcWithDefaultRoute();

app.UseStaticFiles();

app.UseRuntimeInfoPage();

}public voidConfigureServices(IServiceCollection services)

{

services.AddMvc();

services.AddEntityFramework()

.AddSqlServer()

.AddDbContext(options =>{

options.UseSqlServer(Configuration["data:ConnectionString"]);

});

services.AddTransient();

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值