Micro blog about Answer to the Ultimate Question of Life, the Universe, and Everything
  • Home
    • List all categories
    • Sitemap
  • Downloads
    • WebSphere
    • Hitachi902
    • Hospital
    • Kryptonite
    • OCR
    • APK
  • About me
    • Gallery
      • Italy2022
      • Côte d'Azur 2024
    • Curriculum vitae
      • Resume
      • Lebenslauf
    • Social networks
      • Facebook
      • Twitter
      • LinkedIn
      • Xing
      • GitHub
      • Google Maps
      • Sports tracker
    • Adventures planning
  1. You are here:  
  2. Home

log4net example

Details
Written by: Stanko Milosev
Category: C#
Published: 22 December 2023
Last Updated: 24 December 2023
Hits: 1138
Here is my example of log4net.

First console example

Start new console app

Install package log4net

Add XML file, name it like "log4netConfiguration.xml" and in properties set "Copy to Output Directory" to "Copy always":

<?xml version="1.0" encoding="utf-8" ?> 
<log4net>
    <appender name="myConsoleAppender" type="log4net.Appender.ConsoleAppender">
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%-4timestamp [%thread] %-5level %logger %ndc - %message%newline" />
        </layout>
    </appender>
    
    <root>
        <level value="DEBUG" />
        <appender-ref ref="myConsoleAppender" />
    </root>
</log4net>

Here notice the name of appender: myConsoleAppender

Code:

using log4net;
using log4net.Repository;
using System.Reflection;

if (!File.Exists("log4netConfiguration.xml"))
    throw new Exception("File log4netConfiguration.xml does not exist");

ILoggerRepository loggerRepository = LogManager.GetRepository(Assembly.GetEntryAssembly());
log4net.Config.XmlConfigurator.Configure(loggerRepository, new FileInfo("log4netConfiguration.xml"));
var log = LogManager.GetLogger(MethodBase.GetCurrentMethod()?.DeclaringType);
log.Debug("test");
Example download from here

Second console and file example

Just change XML to:

<?xml version="1.0" encoding="utf-8" ?> 
<log4net>
    <appender name="myConsoleAppender" type="log4net.Appender.ConsoleAppender">
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%-4timestamp [%thread] %-5level %logger %ndc - %message%newline" />
        </layout>
    </appender>
	
	<appender name="myRollingFileAppender" type="log4net.Appender.RollingFileAppender">
		<file value="example.log" />
		<appendToFile value="true" />
		<maximumFileSize value="100KB" />
		<maxSizeRollBackups value="2" />
 
		<layout type="log4net.Layout.PatternLayout">
			<conversionPattern value="%level %thread %logger - %message%newline" />
		</layout>
	</appender>	
    
    <root>
        <level value="DEBUG" />
        <appender-ref ref="myConsoleAppender" />
        <appender-ref ref="myRollingFileAppender" />
    </root>
</log4net>
Notice myRollingFileAppender.

Third WinForms and TextBox example

This example I took from here

XML configuration:

<?xml version="1.0" encoding="utf-8" ?>
<log4net>

	<appender name="myTextBoxAppender" type="log4netWinFormsExample.TextBoxAppender, log4netWinFormsExample">
		<formName value="Form1"/>
		<textBoxName value="textBox1"/>
		<layout type="log4net.Layout.PatternLayout">
			<conversionPattern value="%date %-5level %logger - %message" />
		</layout>
	</appender>

	<root>
		<level value="DEBUG" />
		<appender-ref ref="myTextBoxAppender" />
	</root>
</log4net>
Here notice that I have added namespace "log4netWinFormsExample" in the type attribute of appender node:

<appender name="myTextBoxAppender" type="log4netWinFormsExample.TextBoxAppender, log4netWinFormsExample">
TextBoxAppender class:
using log4net.Appender;

namespace log4netWinFormsExample;

public class TextBoxAppender : AppenderSkeleton
{
    private TextBox _textBox;
    public TextBox AppenderTextBox
    {
        get
        {
            return _textBox;
        }
        set
        {
            _textBox = value;
        }
    }
    public string FormName { get; set; }
    public string TextBoxName { get; set; }

    private Control FindControlRecursive(Control root, string textBoxName)
    {
        if (root.Name == textBoxName) return root;
        foreach (Control c in root.Controls)
        {
            Control t = FindControlRecursive(c, textBoxName);
            if (t != null) return t;
        }
        return null;
    }

    protected override void Append(log4net.Core.LoggingEvent loggingEvent)
    {
        if (_textBox == null)
        {
            if (String.IsNullOrEmpty(FormName) ||
                String.IsNullOrEmpty(TextBoxName))
                return;

            Form form = Application.OpenForms[FormName];
            if (form == null)
                return;

            _textBox = (TextBox)FindControlRecursive(form, TextBoxName);
            if (_textBox == null)
                return;

            form.FormClosing += (s, e) => _textBox = null;
        }
        _textBox.Invoke((MethodInvoker)delegate
        {
            _textBox.AppendText(loggingEvent.RenderedMessage + Environment.NewLine);
        });
    }
}
Here notice line:
_textBox.AppendText(loggingEvent.RenderedMessage + Environment.NewLine);
Instead you could write:
_textBox.AppendText(RenderLoggingEvent(loggingEvent));
To take advantage of a pattern layout as described in this comment.

The main code:

using System.Reflection;
using log4net;
using log4net.Repository;

namespace log4netWinFormsExample;

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void btnLogIt_Click(object sender, EventArgs e)
    {
        if (!File.Exists("log4netConfiguration.xml"))
            throw new Exception("File log4netConfiguration.xml does not exist");

        ILoggerRepository loggerRepository = LogManager.GetRepository(Assembly.GetEntryAssembly());
        log4net.Config.XmlConfigurator.Configure(loggerRepository, new FileInfo("log4netConfiguration.xml"));
        var log = LogManager.GetLogger(MethodBase.GetCurrentMethod()?.DeclaringType);
        log.Debug("test");
    }
}
Example download from here

Two examples of WebAPI with multiple Post parameters

Details
Written by: Stanko Milosev
Category: C#
Published: 15 July 2023
Last Updated: 15 July 2023
Hits: 1808
First example
WebAPI:
[HttpPost]
public string Post(string value1, string value2)
{
	return $"Sent: {value1}, {value2}";
}
Console:
Console.WriteLine("************* POST *************");

HttpClient httpClientPost = new HttpClient();
Task<HttpResponseMessage> httpResponseMessage = httpClientPost.PostAsync(@"https://localhost:7037/api/Values?value1=test1&value2=test2'", null);
Task<string> httpClientPostResult = httpResponseMessage.Result.Content.ReadAsStringAsync();
Console.WriteLine(httpClientPostResult.Result);
Example download from here

---

Second example.

First install Microsoft.AspNetCore.Mvc.NewtonsoftJson

In \WebApi\WebApi\Program.cs add line:

builder.Services.AddMvc().AddNewtonsoftJson();
Now Program.cs looks like:
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddMvc().AddNewtonsoftJson();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run();
Controller:
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json.Linq;

namespace WebApi.Controllers;

[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
    // POST api/<ValuesController>
    [HttpPost]
    public string Post([FromBody] JObject data)
    {
        return "test";
    }
}
Console:
using System.Text;

Console.WriteLine("************* POST *************");

HttpClient httpClientPost = new HttpClient();

Task<HttpResponseMessage> httpResponseMessage = httpClientPost.PostAsync(@"https://localhost:7037/api/Values"
    , new StringContent(@"{""additionalProp1"":[""string""],""additionalProp2"":[""string""],""additionalProp3"":[""string""]}"
        , Encoding.UTF8
        , "application/json"));

Task<string> httpClientPostResult = httpResponseMessage.Result.Content.ReadAsStringAsync();
Console.WriteLine(httpClientPostResult.Result);
Taken from here.

Example download from here.

HttpClient Get and Post

Details
Written by: Stanko Milosev
Category: C#
Published: 18 March 2023
Last Updated: 20 March 2023
Hits: 1561
  • core
Get:
HttpClient httpClientGet = new HttpClient();
Task<string> httpClientGetResult = httpClientGet.GetStringAsync(@"https://localhost:7037/api/Values");
Console.WriteLine(httpClientGetResult.GetAwaiter().GetResult());
Post:
HttpClient httpClientPost = new HttpClient();

Task<HttpResponseMessage> httpResponseMessage = httpClientPost.PostAsync(@"https://localhost:7037/api/Values"
    , new StringContent(@"""string Test"""
        , Encoding.UTF8
        , "text/json"));

Task<string> httpClientPostResult = httpResponseMessage.Result.Content.ReadAsStringAsync();
Console.WriteLine(httpClientPostResult.Result);
Example download from here. Example contains also dummy Web Api for test purposes.

UPDATE: Just a short notice, correct way to use HttpClient synchronously:

var task = Task.Run(() => myHttpClient.GetAsync(someUrl)); 
task.Wait();
var response = task.Result;
From here. Also, HttpClient is IDisposable

Automatically restore NuGet packages

Details
Written by: Stanko Milosev
Category: C#
Published: 10 February 2023
Last Updated: 10 February 2023
Hits: 1464
For the article Writing Custom Control in new WPF XAML Designer I wrote the example app where I needed automatically to restore NuGet package. Write NuGet.Config file in folder where is *.sln file, and write it like:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <packageRestore>
    <add key="enabled" value="True" />
    <add key="automatic" value="True" />
  </packageRestore>
  <packageSources>

    <clear />

    <add key="My Private NuGet Server" value="package" />

  </packageSources>  
</configuration>
From here.
  1. Two ways of getting window handle and title
  2. Example of KML file with images
  3. Dynamically Loading Assemblies
  4. KML example

Subcategories

C#

Azure

ASP.NET

JavaScript

Software Development Philosophy

MS SQL

IBM WebSphere MQ

MySQL

Joomla

Delphi

PHP

Windows

Life

Lazarus

Downloads

Android

CSS

Chrome

HTML

Linux

Eclipse

Page 6 of 164

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10