loader
Foto

További logolási adatok mentése NET-es projektekben IV. (SQL)

Most azt nézzük meg, hogy hogyan tudjuk kiegészíteni az SQL adattáblánkat plusz oszlopokkal. Néha előfordul, hogy nem csak a "szokásos" logolási információkat akarjuk elmenteni az adattáblába, hanem szeretnénk egyéb adatokat is eltárolni (pl.: IP cím, stb).

Indítsuk el ismét a VS2012-t és hozzunk létre egy konzolalkalmazást (ConsoleLog4NetSQL2). A logoláshoz szükséges szerelvény letöltéséről és használatáról már korábban itt és itt szó volt.

Ha telepítve van, akkor indítsuk el  az SQL Server Management Studio-t és lépjünk be a számítógépünkön lévő szerverre (általában sqlexpress). Ez látható az első ábrán.

kep1
1. ábra   Belépés az SQL szerverre
 

Először hozzuk létre a teszt adatbázist, benne a logmentesUj nevű adattáblát is. Itt fogjuk eltárolni a logolási eredményeinket, illetve az egyéb adatokat is. Itt fog helyet kapni a két új oszlop is (User1, User2). A korábbi cikkel ellentétben, a létrehozandó adattábla tartalmazni fog egy kulcsmezőt is (de ez nem kötelező).
 

1. Adattábla létrehozása

Írjuk be a projektünkbe a következő kódot. Ennek segítségével létrehozunk egy adatbázist (teszt) és egy adattáblát (logmentesUj). 

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Reflection;
using System.Text;
using log4net;
using log4net.Config;

namespace ConsoleLog4NetSQL2
{
    class Program
    {
        static void Main(string[] args)
        {
            SqlTableCreate();
        }

        private static void SqlTableCreate()
        {
            string commandSql = @"CREATE TABLE [dbo].[logmentesUj] (
                                [Id] [int] IDENTITY (1, 1) PRIMARY KEY NOT NULL,
                                [Date] [datetime] NOT NULL,
                                [Thread] [nvarchar] (255) NOT NULL,
                                [Level] [nvarchar] (50) NOT NULL,
                                [Logger] [nvarchar] (255) NOT NULL,
                                [Message] [nvarchar] (4000) NOT NULL,
                                [User1] [nvarchar] (100) NULL,
                        [User2] [nvarchar] (200) NULL,

                                [Exception] [nvarchar] (Max) NULL)";
 

            //localhostban hoz létre adattáblát
            using (SqlConnection con = new SqlConnection())
            {
                con.ConnectionString =
                        @"Data Source = .\sqlexpress;" +
                        "Database = teszt;" +
                        "Integrated Security = SSPI;" +
                        "Pooling = False";
                con.Open();
                SqlCommand command = new SqlCommand(commandSql, con);
                command.ExecuteNonQuery();
                con.Close();

            }
        }
    }
}

 

Futtassuk le egyszer a programot debug módban (F5). Ekkor a teszt adatbázis létrejön, benne a logmentesUj adattábla (2. ábra).

kep
2. ábra   A létrehozott logmentes adattábla design nézetben

 

Láthatjuk, hogy az "Id" kulcsmező, illetve megjelentek a "User1" és a "User2" oszlopok is. 

 

2. Log rekordok létrehozása

Most módosítsuk a projektünket a következő programkód szerint. Ennek segítségével kiírunk az adattáblánkba egy üzenetet (Info), majd dobunk egy kivételt, mert a tömbünk (tomb) csak tíz elemből áll. Viszont most nekünk "kell" előtte gondoskodni arról, hogy a "User1" és a "User2" oszlopokba is kerüljenek értékek. Tekintettel arra, hogy ezek "NULL" típusúak, ezért nem kötelező beleírnunk adatot.

Ha szeretnénk a logolás során beleírni ebbe a két új oszlopba, akkor ezt a kódot kell használnunk :

log4net.GlobalContext.Properties["user1"] = "tetszőleges szöveg (max 100 karakter)"; log4net.GlobalContext.Properties["user2"] = "tetszőleges szöveg (max 200 karakter)";

 

Bármilyen logolási információt szeretnénk eltárolni az adatbázisba, az előbb megadott értékek is eltárolásra kerülnek.

 

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Reflection;
using System.Text;
using log4net;
using log4net.Config;

namespace ConsoleLog4NetSQL3
{
    class Program
    {
        private static readonly ILog Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
        
        static void Main(string[] args)
        {
            XmlConfigurator.Configure();
            log4net.GlobalContext.Properties["user1"] = "Online újság";
            log4net.GlobalContext.Properties["user2"] = "SQL mentés plusz táblával";
            
            Log.Info("WebElektronika");

            log4net.GlobalContext.Properties["user2"] = "kivételdobás törénik";
            
            int[] tomb = new int[10];
            try
            {
                int a = tomb[12];
            }
            catch (Exception ex)
            {
                Log.Error("kivétel", ex);
            }
        }
    }
}

 

A logolás eredménye a 3. ábrán látható.

kep
3. ábra   A logmentes adattábla tartalma (klikk a képre)
 

 

3. App.config tartalma

Ahhoz, hogy sikeresen tudjuk elmenteni a logolási eredményeinket egy SQL adattáblába, a következő config file-ra lesz szükségünk.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net"/>
  </configSections>
  <log4net>
    <root>
      <level value="DEBUG" />
      <appender-ref ref="ADONetAppender" />
    </root>
    <appender name="ADONetAppender" type="log4net.Appender.ADONetAppender">
      <bufferSize value="100" />
      <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      <connectionString value="Data Source=.\sqlexpress;initial Catalog=teszt; Integrated Security=True;"/>
      <commandText value="INSERT INTO logmentesUj ([Date],[Thread],[Level],[Logger],[Message],[User1],[User2],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @user1, @user2, @exception)" />
      <parameter>
        <parameterName value="@log_date"/>
        <dbType value="DateTime"/>
        <layout type="log4net.Layout.RawTimeStampLayout"/>
      </parameter>
      <parameter>
        <parameterName value="@thread"/>
        <dbType value="String"/>
        <size value="255"/>
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%thread"/>
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@log_level"/>
        <dbType value="String"/>
        <size value="50"/>
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%level"/>
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@logger"/>
        <dbType value="String"/>
        <size value="255"/>
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%logger"/>
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@message"/>
        <dbType value="String"/>
        <size value="4000"/>
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%message"/>
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@user1"/>
        <dbType value="String"/>
        <size value="500"/>
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%property{user1}"/>
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@user2"/>
        <dbType value="String"/>
        <size value="500"/>
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%property{user2}"/>
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@exception"/>
        <dbType value="String"/>
        <size value="4000"/>
        <layout type="log4net.Layout.ExceptionLayout"/>
      </parameter>
    </appender>
  </log4net>
</configuration>



Egyéb cikkek

Mappa

További cikkeink ebben a témakörben

Régebbi cikkeink

Ebben a cikkben bemutatjuk a metódusok alapjait. Nem érintjük viszont például a túlterhelést, ezt egy következő részben tekintjük át.. . . .

Ebben a cikkben megismerjük a C# nyelv által használt változók nagy részét. Nézünk egy példát a típuskonverzióra.. . . .

A sorozatunknak ebben a részében átnézzük általánosságban az osztályok alapjait egy konzolalkalmazás segítségével. A konstruktorok viszont a következő részben kerülnek bemutatásra.. . . .