4

最近,我们将我们的解决方案 (ASP.NET MVC4) 移至 Windows Azure,到目前为止,它运行良好。我们唯一担心的是,无论我们实现什么方法,我们都无法找到我们的日志文件:

实际上,我们现有的应用程序使用 log4net 框架进行日志记录。一旦我们在 Windows Azure 上移动了我们的解决方案,我们仍然希望在 azure 中使用 log4net,而对现有代码的更改最少。为了实现以下方法,我们关注了许多博客和教程:

  1. 使用 Windows Azure 诊断模块将日志文件同步到 Blob 存储。
  2. 使用自定义 log4net appender 直接写入表存储。
  3. 记录到 Trace 日志并同步到表存储。

不幸的是,以上都没有达到预期的结果。我们仍然无法访问我们的日志。有没有关于如何在 Windows Azure 中使用 Log4net 的官方资料?

第 1 步:我导入了 Log4net.Azure 作为对我的 MVC4 WebRole 应用程序的引用

Step2:我在 WebRole 类的 On_Start 方法中添加了配置行

     public class WebRole : RoleEntryPoint
{

    private static readonly ILog _logger = LogManager.GetLogger(typeof(WebRole));

    public override void Run()
    {
        _logger.InfoFormat("{0}'s entry point called", typeof(WebRole).Name);

        while (true)
        {
            Thread.Sleep(10000);
            _logger.Debug("Working...");
        }
    }

    public override bool OnStart()
    {
        BasicConfigurator.Configure(AzureAppender.New(conf =>
        {


            conf.Level = "Debug";

            conf.ConfigureRepository((repo, mapper) =>
            {
                repo.Threshold = mapper("Debug"); // root
            });

            conf.ConfigureAzureDiagnostics(dmc =>
            {
                dmc.Logs.ScheduledTransferLogLevelFilter = LogLevel.Information;
            });
        }));

        return base.OnStart();
    }

第三步:我在需要记录的时候创建了一个 ILog 实例,这里是一个例子:

    public class TestController : ApiController
{

    private static readonly ILog _logger = LogManager.GetLogger(typeof(WebRole));

    [HttpGet]
    public String Get()
    {

        _logger.InfoFormat("{0}'s entry point called", typeof(WebRole).Name);
        _logger.Debug("<<<<<<<<<< WS just invoked >>>>>>>>>>>>...");

        return "hello world logs on Azure :)";
    }
}
4

3 回答 3

1

您可以将 AdoNetAppender 与 Azure SQL 数据库和配置一起使用,如下例所示:http: //logging.apache.org/log4net/release/config-examples.html

注意:使用以下语句创建日志表:

CREATE TABLE [dbo].[Log](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Date] [datetime] NOT NULL,
[Thread] [varchar](255) NOT NULL,
[Level] [varchar](50) NOT NULL,
[Logger] [varchar](255) NOT NULL,
[Message] [varchar](4000) NOT NULL,
[Exception] [varchar](2000) NULL,
CONSTRAINT [PK_Log] PRIMARY KEY CLUSTERED (
  [Id] ASC
))
于 2013-08-12T12:16:53.563 回答
1

回复:log4net.Azure

日志将不可见,因为实现使用 BufferingAppenderSkeleton 基类,默认情况下缓冲区大小为 512。您必须让应用程序在 ram 中创建 513 个日志条目,然后才能刷新它们。我这样做是为了提高性能。

您有 3 个选项可以使其在 MVC/ASP.NET 环境中按照您的期望工作:

  1. 在配置文件中更改缓冲区大小
  2. 调用刷新(但仅在调试模式下,这是一个性能杀手)
  3. 当您的应用程序关闭时调用 flush 以便立即执行写入
于 2015-09-08T16:11:42.773 回答
0

如果您在 webrole 中使用完整的 IIS(这是默认配置),则网站和 webrole 在单独的进程中运行。

因此,您必须设置两次日志记录。一次在 WebRole 的 OnStart() 中,一次在 Global.asax 的 Application_Start() 中。

于 2013-07-16T08:27:44.440 回答