Question

According to LogEntries documentation Account key should be filled in Web.config file. At the same time, it exists in AppHarbor configuration variables. Can I read the value from the configuration variables instead of using hard-coded value?

Was it helpful?

Solution

the le_nlog package has been updated in the last few days with the appropriate code for grabbing the appharbor injected config variables from the web.config, so now the nuget can be installed, the add-on added to your app and you're good to go without manually editing anything. Unless of course as pointed out above in the case where you want to log from your local machine, in which case the config variables should be pasted into your web.config in the appSettings section which is now included in the web.config.transform of the le_nlog package

OTHER TIPS

You don't have to manually add the configuration, AppHarbor will automatically insert the relevant values. Note that if you want to use LogEntries when testing on your local machine, you need to specify the configuration as copied from AppHarbor.

Use this class instead of the one in the le_nlog package. Also change your assembly in the config:

<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);
            }
        }
    }
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top