Avatar billede Droa Seniormester
28. september 2014 - 20:24 Der er 9 kommentarer og
1 løsning

Logger Switch til screen eller fil

Hej Eksperter, jeg er igang med at lave en lille simpel Wrapper til Console.WriteLine, som kan informere data'en efter nødvendighed, til skærm eller fil..

SEVERE (highest)
WARNING
INFO
CONFIG
FINE
FINER
FINEST

Jeg regner med at bruge en simpel bitwise methode til at teste om en information skal printes til fil/skærm.. men mit spørgsmål er mere hvordan man bedst holder WriteLine ren, mens man stadig kan sende denne information med?


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleTool
{

    /// <summary>
    /// WIP - Switch mellem Screen eller/og fil -logger
    /// </summary>
    public class Logger
    {
        public static void WriteLine()
        {
            Console.WriteLine();
        }

        public static void WriteLine(bool value)
        {
            Console.WriteLine(value);
        }

        public static void WriteLine(char value)
        {
            Console.WriteLine(value);
        }

        public static void WriteLine(char[] buffer)
        {
            Console.WriteLine(buffer);
        }

        public static void WriteLine(decimal value)
        {
            Console.WriteLine(value);
        }

        public static void WriteLine(double value)
        {
            Console.WriteLine(value);
        }

        public static void WriteLine(float value)
        {
            Console.WriteLine(value);
        }

        public static void WriteLine(int value)
        {
            Console.WriteLine(value);
        }

        public static void WriteLine(long value)
        {
            Console.WriteLine(value);
        }

        public static void WriteLine(object value)
        {
            Console.WriteLine(value);
        }

        public static void WriteLine(string value)
        {
            Console.WriteLine(value);
        }

        public static void WriteLine(uint value)
        {
            Console.WriteLine(value);
        }

        public static void WriteLine(ulong value)
        {
            Console.WriteLine(value);
        }

        public static void WriteLine(string format, object arg0)
        {
            Console.WriteLine(format, arg0);
        }

        public static void WriteLine(string format, params object[] arg)
        {
            Console.WriteLine(format, arg);
        }
    }
}


Som koden er ligenu, har den slet ikke denne feature indkodet, da jeg stadig bøvler med hvordan jeg ville gøre dette.

kan jeg sætte en static variable, med denne information, eller ville det være dumt?


jeg er kommet op med denne mulighed, men er den ok?


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleTool
{

    /// <summary>
    /// WIP - Switch mellem Screen eller/og fil -logger
    /// </summary>
    ///

    public class Logger
    {

        public static int SEVERE = 1;
        public static int WARNING = 2;
        public static int INFO = 4;
        public static int CONFIG = 8;
        public static int FINE = 16;
        public static int FINEST = 32;

        public static int DebugLevel = WARNING; //Level som næste WriteLine vil blive skrevet med
        public static int PrintLevel = SEVERE | WARNING;

        private static bool _testPrint()
        {
            if ((DebugLevel & PrintLevel) != 0)
            {
                return true;
            }
            return false;
        }

        public static void WriteLine()
        {
            if (_testPrint())
            {
                Console.WriteLine();
            }
        }

        public static void WriteLine(bool value)
        {
            if (_testPrint())
            {
                Console.WriteLine(value);
            }
        }

        public static void WriteLine(char value)
        {
            if (_testPrint())
            {
                Console.WriteLine(value);
            }
        }

        public static void WriteLine(char[] buffer)
        {
            if (_testPrint())
            {
                Console.WriteLine(buffer);
            }
        }

        public static void WriteLine(decimal value)
        {
            if (_testPrint())
            {
                Console.WriteLine(value);
            }
        }

        public static void WriteLine(double value)
        {
            if (_testPrint())
            {
                Console.WriteLine(value);
            }
        }

        public static void WriteLine(float value)
        {
            if (_testPrint())
            {
                Console.WriteLine(value);
            }
        }

        public static void WriteLine(int value)
        {
            if (_testPrint())
            {
                Console.WriteLine(value);
            }
        }

        public static void WriteLine(long value)
        {
            if (_testPrint())
            {
                Console.WriteLine(value);
            }
        }

        public static void WriteLine(object value)
        {
            if (_testPrint())
            {
                Console.WriteLine(value);
            }
        }

        public static void WriteLine(string value)
        {
            if (_testPrint())
            {
                Console.WriteLine(value);
            }
        }

        public static void WriteLine(uint value)
        {
            if (_testPrint())
            {
                Console.WriteLine(value);
            }
        }

        public static void WriteLine(ulong value)
        {
            if (_testPrint())
            {
                Console.WriteLine(value);
            }
        }

        public static void WriteLine(string format, object arg0)
        {
            if (_testPrint())
            {
                Console.WriteLine(format, arg0);
            }
        }

        public static void WriteLine(string format, params object[] arg)
        {
            if (_testPrint())
            {
                Console.WriteLine(format, arg);
            }
        }
    }
}
Avatar billede arne_v Ekspert
28. september 2014 - 20:39 #1
1) Hvorfor ikke bruge eksisternde logging framework som log4net eller nlog?
Avatar billede arne_v Ekspert
28. september 2014 - 20:41 #2
2) Drop static. Instans fields med config og instans metoder maa vaere vaejen frem. Du kan evt. hente instans fra static context.
Avatar billede arne_v Ekspert
28. september 2014 - 20:41 #3
3) Overvej at vaere doven og lav en WriteLine(object o) og spar en masse metoder.
Avatar billede Syska Mester
28. september 2014 - 20:42 #4
Er der nogen grund til du vil have alle de overloads?

Hvis det er "Logging" som skal være brugbart ville jeg kunne have en.

Log(string format, params object[] args)

Jeg kan ikke rigtig komme på hvor man bare vil sende en int, long what ever til et Logging system.

Personen der læser det vil det jo ikke rigtig give nogen mening for ...  Hvis man læser "10" i sin log ... aha, øhhh ... synes ikke det giver mening, men det er måske bare mig.

Du kan eventuelt kigge på hvordan log4net eller nlog gør det.
Avatar billede Droa Seniormester
28. september 2014 - 22:19 #5
jeg har prøvet log4net, men kan ikke rigtigt finde ud af og konfigurere det, og har ikke 14 dage til og lære noget nyt, og hvordan man sætter det hele op :)
Avatar billede arne_v Ekspert
28. september 2014 - 23:08 #6
Interesseret i et log4net eksempel?
Avatar billede arne_v Ekspert
28. september 2014 - 23:42 #7
Demo program:


using System;

using log4net;
using log4net.Config;

namespace E.Irrelevant
{
    public class A
    {
        private ILog log = LogManager.GetLogger(typeof(A).FullName);
        public void M()
        {
            log.Debug("A Debug");
            log.Info("A Info");
            log.Warn("A Warn");
            log.Error("A Error");
        }
    }
}

namespace E.Important
{
    public class B
    {
        private ILog log = LogManager.GetLogger(typeof(B).FullName);
        public void M()
        {
            log.Debug("B Debug");
            log.Info("B Info");
            log.Warn("B Warn");
            log.Error("B Error");
        }
    }
}
   
namespace E
{
    using E.Irrelevant;
    using E.Important;
    public class Program
    {
        public static void Main(string[] args)
        {
            XmlConfigurator.Configure();
            A a = new A();
            a.M();
            B b = new B();
            b.M();
            Console.ReadKey();
        }
    }
}


Demo config:


<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <configSections>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
    </configSections>
    <log4net>
        <appender name="console" type="log4net.Appender.ConsoleAppender,log4net">
            <threshold value="ERROR" /> <!-- filter everything below ERROR for console -->
            <layout type="log4net.Layout.PatternLayout,log4net">
                <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
            </layout>
        </appender>
        <appender name="file" type="log4net.Appender.FileAppender,log4net">
            <threshold value="INFO" /> <!-- filter everything below INFO for file -->
            <file value="C:\work\test.log" />
            <appendToFile value="true" />
            <layout type="log4net.Layout.PatternLayout,log4net">
                <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
            </layout>
        </appender>
        <root>
            <level value="ALL"/> <!-- default no filter -->
            <appender-ref ref="console"/>
            <appender-ref ref="file"/>
        </root>
        <logger name="E.Irrelevant">
            <level value="WARN"/> <!-- filter everything below WARN in namespace E.Irrelevant -->
        </logger>
    </log4net>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
    </startup>
</configuration>


console:


2014-09-28 17:39:37,015 [1] ERROR E.Irrelevant.A - A Error
2014-09-28 17:39:37,015 [1] ERROR E.Important.B - B Error


test.log:


2014-09-28 17:39:37,015 [1] WARN  E.Irrelevant.A - A Warn
2014-09-28 17:39:37,015 [1] ERROR E.Irrelevant.A - A Error
2014-09-28 17:39:37,015 [1] INFO  E.Important.B - B Info
2014-09-28 17:39:37,015 [1] WARN  E.Important.B - B Warn
2014-09-28 17:39:37,015 [1] ERROR E.Important.B - B Error
Avatar billede Droa Seniormester
30. september 2014 - 01:51 #8
mange tak for eksemplet, tror det har været min xml config jeg har haft smadret i mit sidste forsøg, den skrev nemlig intet ud :)

ligger du et svar? :)
Avatar billede arne_v Ekspert
30. september 2014 - 02:06 #9
ok
Avatar billede arne_v Ekspert
30. september 2014 - 20:17 #10
Config filen er lidt tung, men faar man fod paa det saa gaar det.

Jeg haaber at mit eksempel viste hvordan man kan filtrere baade paa appender og paa logger.

Og du kan naturligvis ogsaa overveje hvilket format du vil logge i. "%d [%t] %-5p %c - %m%n" er bare noget jeg bruger.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester