Чтение конфигурации LogEntries из среды - PullRequest
2 голосов
/ 03 апреля 2012

Согласно документации LogEntries Ключ учетной записи должен быть заполнен в файле Web.config.В то же время он существует в переменных конфигурации AppHarbor.Могу ли я прочитать значение из переменных конфигурации вместо использования жестко запрограммированного значения?

Ответы [ 3 ]

2 голосов
/ 04 апреля 2012

Вам не нужно вручную добавлять конфигурацию, AppHarbor автоматически вставит соответствующие значения. Обратите внимание, что если вы хотите использовать LogEntries при тестировании на локальном компьютере, вам необходимо указать конфигурацию, скопированную из AppHarbor.

1 голос
/ 09 апреля 2012

пакет le_nlog был обновлен в последние несколько дней с помощью соответствующего кода для получения введенных переменных конфигурации appharbor из web.config, так что теперь можно установить nuget, добавить дополнение в ваше приложение и вы 'хорошо, чтобы идти без редактирования вручную ничего.Если, конечно, как указано выше, в случае, если вы хотите войти с локального компьютера, в этом случае переменные конфигурации должны быть вставлены в ваш web.config в разделе appSettings, который теперь включен в web.config.transform ofпакет le_nlog

0 голосов
/ 04 апреля 2012

Используйте этот класс вместо класса в пакете le_nlog. Также измените вашу сборку в конфиге:

<nlog>
<extensions>
  <add assembly="MyAssembly"/>
</extensions>
<targets>
  <target name="logentries" type="Logentries" debug="true" layout="${date:format=ddd MMM dd} ${time:format=HH:mm:ss} ${date:format=zzz yyyy} ${logger} : ${LEVEL}, ${message}, ${exception:format=tostring}" />
</targets>
<rules>
  <logger name="*" minLevel="Info" appendTo="logentries" />
</rules>

/*
   Logentries Log4Net Logging agent
   Copyright 2010,2011 Logentries, Jlizard
   Mark Lacomber <marklacomber@gmail.com>
                                            */

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Net.Security;
using System.Net.Sockets;
using System.IO;

using NLog;
using NLog.Common;
using NLog.Config;
using NLog.Internal;
using NLog.Internal.NetworkSenders;
using NLog.Layouts;
using NLog.Targets;

namespace Le
{
    [Target("Logentries")]
    public sealed class LeTarget : TargetWithLayout
    {
        private SslStream sslSock = null;
        private TcpClient leSocket = null;
        private System.Text.UTF8Encoding encoding;

        public LeTarget()
        {

        }

        string GetKey()
        {
            return ConfigurationManager.AppSettings["LOGENTRIES_ACCOUNT_KEY"];
        }

        string GetLocation()
        {
            return ConfigurationManager.AppSettings["LOGENTRIES_LOCATION"];
        }

        [RequiredParameter]
        public bool Debug { get; set; }

        public bool KeepConnection { get; set; }

        private void createSocket(String key, String location)
        {
            this.leSocket = new TcpClient("api.logentries.com", 443);
            this.leSocket.NoDelay = true;
            this.sslSock = new SslStream(this.leSocket.GetStream());
            this.encoding = new System.Text.UTF8Encoding();

            this.sslSock.AuthenticateAsClient("logentries.com");

            String output = "PUT /" + key + "/hosts/" + location + "/?realtime=1 HTTP/1.1\r\n";
            this.sslSock.Write(this.encoding.GetBytes(output), 0, output.Length);
            output = "Host: api.logentries.com\r\n";
            this.sslSock.Write(this.encoding.GetBytes(output), 0, output.Length);
            output = "Accept-Encoding: identity\r\n";
            this.sslSock.Write(this.encoding.GetBytes(output), 0, output.Length);
            output = "Transfer_Encoding: chunked\r\n\r\n";
            this.sslSock.Write(this.encoding.GetBytes(output), 0, output.Length);
        }

        private byte[] GetBytesToWrite(LogEventInfo logEvent)
        {
            string text = this.Layout.Render(logEvent) + "\r\n";

            return this.encoding.GetBytes(text);
        }

        protected override void Write(LogEventInfo logEvent)
        {
            if (this.sslSock == null)
            {
                try
                {
                    this.createSocket(this.GetKey(), this.GetLocation());
                }
                catch (Exception e)
                {
                    WriteDebugMessages("Error connecting to Logentries", e);
                }
            }

            byte[] message = this.GetBytesToWrite(logEvent);

            try
            {
                this.sendToLogentries(message);
            }
            catch (Exception)
            {
                try
                {
                    this.createSocket(this.GetKey(), this.GetLocation());
                    this.sendToLogentries(message);
                }
                catch (Exception ex)
                {
                    WriteDebugMessages("Error sending log to Logentries", ex);
                }
            }
        }

        private void sendToLogentries(byte[] message)
        {
            this.sslSock.Write(message, 0, message.Length);
        }

        private void WriteDebugMessages(string message, Exception e)
        {
            if (!this.Debug) return;
            string[] messages = { message, e.ToString() };
            foreach (var msg in messages)
            {
                System.Diagnostics.Debug.WriteLine(msg);
                Console.Error.WriteLine(msg);
            }
        }
    }
}
...