Logging in C# .NET Modern-day Practices: The Complete Guide (2024)

Logging is a big part of software development for many years now. One can argue that a logging mechanism is a must-have part of any application or library. I would agree with that statement.

Logging has a crucial part to play in a scenario where you can’t use interactive debugging (that is, attaching a debugger like Visual Studio). It allows us to investigate errors after the problem already happened. In some cases, like Production Debugging, logs might be the only information you have.

Even if you can debug your own process, logs can give you priceless information on other components like 3rd party libraries, the .NET framework itself, and the CLR.

Alongside logging, a new term is becoming popular: Monitoring. Monitoring means there’s an automatic tool that reports information on your application. That information is usually errors (Error Monitoring, Crash Monitoring), but also information on requests and on performance (Performance Monitoring). This is very different from logging where your code actively writes messages and exceptions to log. We’re going to talk just about logging today.

Logging can also be used to gather data and statistics on your users. This data can be used to research usage patterns, demographics, and behavior. Needless to say, this kind of data is priceless in some products.

Logging Target Types

When we say logging, we traditionally mean saving the message to a file. That’s indeed logging, but far from the only type of logging. Here are some common logging targets to consider:

  • A database. Logging to a database has many advantages

    • You can retrieve the logs from anywhere, without access to the production machine.
    • It’s easy to aggregate logs from multiple machines.
    • There’s no chance the logs will be deleted from a local machine.
    • You can easily search and extract statistics from the logs. This is especially useful if you’re using Structured Logging. We’ll talk about that later on.

    There’s a myriad of choices for a database to store your logs. We can categorize them as follows:

    • Relational Databases are always an option. They’re easy to set up, can be queried with SQL and most engineers are already familiar with them.
    • NoSQL Databases like CouchDB. These are perfect for structured logs that are stored in JSON format.
    • Time-series Databases like InfluxDB are optimized to store time-based events. This means your logging performance will be better and your logs will take less storage space. This is a good choice for intense high-load logging.
  • Searchable Solutions like Logstash + Elastic Search + Kibana (The “Elastic Stack”) provide a full service for your logs. They will store, index, add search capabilities and even visualize your logs` data. They work best with structured logging.

  • Error Monitoring tools can also act as logging targets. This is very beneficial since they can display errors alongside log messages that were in the same context. The context might be the same Http request for example. A couple of choices are Elmah and Azure Application Insights.

  • Logging to File is still a good logging target. It doesn’t have to be exclusive, you can log both to file and a database for example. For desktop applications, logging to file is very effective. Once a problem has happened, the customer can easily find and send their log files to investigate.

  • Logging to Standard Output (Console) and Debug Output (Trace) – Logging to Console, also known as Standard Output, is very convenient, especially during development. Windows also supports a similar logging target called Debug Output, which you can log to with System.Diagnostics.Trace("My message"). What’s nice about both Console and Trace logging is that you can log messages from native code as well, easily achieving a shared logging system. You can view the Debug Output live with a program like DebugView. You can also use the ConsoleTraceListener class to direct this information anywhere, like to a database.

  • Logging to Event Viewer – If your application is on Windows, you can use Windows Event Log to log messages. It’s pretty easy to do and you can view the message with the Event Viewer program. As a bonus, all crashes are automatically added as event logs. So after any .NET process crash, you can enter the Event Viewer and see the Exception and its Call Stack. This is pretty costly in terms of performance, so it’s best to use just for critical notifications, like fatal errors.

  • Log to ETW – Windows has an extremely fast built-in logging system called Event Tracing for Windows (ETW). You can use it to see logs from the .NET framework, the operating system, and even the kernel. But you can also use ETW for logging yourself with System.Diagnostics.Tracing.EventSource. This is the fastest logging option available in .NET. If you’ve got a hot path that’s executing 100,000 a second, then ETW might be for you. .NET Core 3.0 Preview 5+ now has an ETW alternative called dotnet-trace which is cross-platform.

Structured Logging Revolution

In traditional logging, we log a simple string message. To that message, we’re usually adding a Timestamp, a log level, and possibly additional context like an Exception.

try{ _log.Debug("About to do something"); // ...}catch (Exception ex){ _log.Error("Doing something failed with", ex);}

In Structured Logging we’re also adding structured fields to the message. That is, we’re marking some data as fields and giving it a name. Later, we will be able to search in those fields, filter according to them, and gather data. According to your logging library, a structured log message might look something like this:

var requestInfo = new { Url = "https://myurl.com/data", Payload = 12 };_log.Information("Request info is {@RequestInfo}", requestInfo);

When sent to the server, this is saved as JSON rather than a regular string. The implications are huge. Now, we can find all log messages with a certain Payload value. Or filter log messages according to the request URL. We can save consumer data and try and find a correlation with their usage. Perhaps we’ll find that women between 30-35 are more likely to buy shoes during Summer. This means we can suggest more shoes, get more sales and have big Christmas bonuses. All with the power of structured logging.

All popular logging frameworks support custom logging, though I believe Serilog was the first to implement structured logging as a first-class citizen.

Logging Frameworks

There are 4 logging frameworks that pretty much dominate the .NET space. Those are log4net, NLog, Serilog, and Microsoft.Extensions.Logging (only for .NET Core and ASP.NET Core). All of them are great, free, and offer similar functionality.

Let’s talk first of the three community logging frameworks: log4net, NLog, and Serilog.

log4net

Apache log4net is the oldest of the three frameworks. It was originally ported from Java’s log4j project. You’ll find it in most older .NET projects.

To set up, you’ll need to build an XML configuration (log4net.config) file that looks something like this:

<log4net> <appender name="RollingFile" type="log4net.Appender.RollingFileAppender"> <file value="my_log.log" /> <appendToFile value="true" /> <maximumFileSize value="50KB" /> <maxSizeRollBackups value="2" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date %level %message%newline" /> </layout> </appender> <root> <level value="ALL" /> <appender-ref ref="RollingFile" /> </root></log4net>

Then, add the following to AssemblyInfo.cs:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config")]

Then, we can start logging:

class MyClass{ private static readonly log4net.ILog _log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); public void Foo() { _log.Debug("Foo started"); }}

log4net supports structured logging, but not as innately as the others. It supports a bunch of logging targets called appenders. Although it supports fewer targets than others out of the box, log4net is so huge that whatever isn’t supported, you can find a custom implementation on the internet, like this log4net-to-Elasticsearch appender.

log4net’s biggest problem is probably the rather difficult configuration. Let’s see how its competitors handled this.

NLog

NLog appeared second after log4net and gained a lot of popularity.

Like other libraries, NLog starts with a NuGet package. Then, you can configure either in XML like log4net or in code. I’ll show how to do it in code (from documentation):

var config = new NLog.Config.LoggingConfiguration();// Targets where to log to: File and Consolevar logfile = new NLog.Targets.FileTarget("logfile") { FileName = "file.txt" };var logconsole = new NLog.Targets.ConsoleTarget("logconsole"); // Rules for mapping loggers to targets config.AddRule(LogLevel.Info, LogLevel.Fatal, logconsole);config.AddRule(LogLevel.Debug, LogLevel.Fatal, logfile); // Apply config NLog.LogManager.Configuration = config;

Now, start logging:

class MyClass{ private static readonly NLog.Logger _log_ = NLog.LogManager.GetCurrentClassLogger(); public void Foo() { _log.Debug("Foo started"); // structured logging: _log.Info("Hello {Name}", "Michael"); }}

NLog has an easy setup and API. By several accounts, it’s also faster than log4net. It supports structured logging, and 84 targets out of the box including all the popular databases. Like with any of the libraries, you can extend NLog to write logs wherever you want.

Serilog

Serilog was last to join the party but added a much-needed feature: Structure logging as a first-class citizen. We’ll get back to that.

To use Serilog, first install their NuGet. Then, add the setup in code (see official documentation):

class Program{ static void Main() { Log.Logger = new LoggerConfiguration() .MinimumLevel.Debug() .WriteTo.Console() .WriteTo.File("logs\\my_log.log", rollingInterval: RollingInterval.Day) .CreateLogger();

And use:

class MyClass{ public void Foo() { Log.Debug("Foo started"); // structured logging: Log.Debug("Requesting from URL {A} with {B}", myUrl, myPayload); }}

So if you thought NLog is as simple as it gets, Serilog was able to make the setup even easier. Serilog also supports a big group of targets (Sinks) out of the box.

As far as performance, Serilog seems to be about twice faster than NLog according to this Benchmark. As far as performance, NLog seems to be faster than Serilog according to these benchmarks.

Thanks to Rolf Kristensen for correcting the incorrect benchmark that showed Serilog as faster than NLog.

Which to choose?

First of all, all 3 frameworks are good and provide a rather similar value. Before answering this question, let’s do some popularity research. Looking at NuGet package statistics of the last 6 weeks (up to 11th Aug 2019) we can see the following:

Logging in C# .NETModern-day Practices: The Complete Guide (1)

Serilog is first at 3rd place, NLog is second at 20th and log4net is last at 28th place. A pretty significant margin in favor of Serilog.

Google Trends paints a very different picture:

Logging in C# .NETModern-day Practices: The Complete Guide (2)

According to that, NLog and log4net are competing for the first place, and Serilog is 3rd with a significant margin.

Another interesting statistic is the number of questions in StackOverflow. According to the tags, log4net has about 3700 questions, NLog is with about 2000 questions and Serilog with 832.

Support is also a big consideration. Looking at the NuGet packages, we can see that NLog and Serilog packages are released a few times a month. Whereas log4net is released once or twice a year.

Verdict: Due to the more difficult setup, worse support for structured logging, less maintenance and worse performance, I don’t recommend using log4net for new projects. There are exceptions to this rule. For example, you might have a custom appender made that you don’t want to rewrite for another framework.

As for choosing Serilog or NLog, I think both choices are good. Serilog seems to have better support for structured logging, whereas NLog seems to have better performance. Both are popular and well maintained. So I can’t name a clear winner.

Microsoft.Extensions.Logging (aka ASP.NET Core Logging)

.NET Core and ASP.NET Core come with its own built-in logging framework. When you create a new ASP.NET Core project from the default template, Microsoft.Extensions.Logging will already be included in the project. This is partly why this framework is much more popular than the others as seen in nuget Trends.

ASP.NET Core Logging framework is both an abstraction and implementation. It primarily makes sure you can get the ILogger<T> interface in your ASP.NET Core dependency injection system. You’ll be able to do the following in your controllers:

public class MyController : Controller{ private readonly ILogger _logger; public MyController(ILogger<MyController> logger){ logger.LogInformation("Hello world"); _logger = logger; }}

Where does the logger write to? This depends on its providers, which you can specify on initialization in Program.cs. Providers are just another name for Logging Targets. Like Sinks in Serilog and Appenders in log4net.

public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureLogging(logging => { logging.ClearProviders(); logging.AddConsole();//Adding Console provider }) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });

In this case, we added the Console provider, so all log messages will write to Console. Some of the other logging providers by Microsoft are: File, Debug, EventSource, TraceSource, and ApplicationInsights. But you can add any providers yourself.

There are logging providers for all of the big community logging frameworks. So you can use Microsoft.Extensions.Logging to log messages with Serilog, NLog, or log4net. For Serilog, for example, it’s as simple as adding the Serilog.AspNetCore nuget package and adding the following code. First, define Serilog’s logger in Program.cs:

public static void Main(string[] args){ Log.Logger = new LoggerConfiguration() .Enrich.FromLogContext() .WriteTo.Console() .CreateLogger();

Now, add it to the Host Builder:

public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .UseSerilog(); .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }) 

Should I use Microsoft.Extensions.Logging in all ASP.NET Core apps?

I found that the newer frameworks, Serilog and NLog, are better than ASP.NET Core’s logging framework. They have more features and better usability. This includes better-structured logging support and better contextual data support. When you integrate Serilog or NLog as a provider in Microsoft.Extensions.Logging, you lose some of those abilities if working with the ILogger interface (although you can work directly with the 3rd-party logger).

Having said that, I’m a big believer in doing what’s popular. Developers will be more familiar with popular technologies, you’ll have more documentation, a bigger community, and more questions on StackOverflow. So I would still choose to go with Microsoft.Extensions.Logging for new projects. It provides most of the functionality you’ll need and the abstraction allows to easily change it to a different framework later on.

Logging Best Practices

Whatever framework and logging targets you choose, there are some common best practices to follow.

1. Use Log Levels appropriately

Every logging frameworks associate by default a logging level to each message. The levels are usually Debug, Info, Warn, Error, Fatal or similar. Those are important to convey the type of information logged. Debug and Info show debug information and contextual information that’s helpful to understand the current flow. Warn indicates something is probably wrong. Error indicates an error has occurred. Usually, we’ll want to log Error messages when we catch exceptions. Fatal usually means a major error has occurred that requires to terminate the application.

2. Enable only high-severity logs in Production

As a rule of thumb, we don’t want to enable Debug and Info levels in production. We want to log just Warn messages and above or just Error and above. The reason is better performance, avoid using more storage and possibly avoid sending sensitive information.

That’s why you should make sure to change your logging configuration when deploying to production. It can be as easy as #IF DEBUG clause in code or a special step to change the configuration file in your CI/CD pipeline.

3. Log Exceptions

For production debugging, logging Exceptions is crucial. It’s usually the most important piece of information we need to solve the bug. That means both handled exceptions and unhandled exceptions. For handled exceptions, make sure to log.Error() in the catch clause. For unhandled exceptions, you can register to a special event that fires when an exception is thrown. Or a middleware in ASP.NET Core, like here.

4. Log Context

To understand production problems, we need context. While the Exception is the most important thing, the Context is the 2nd most important. We need to know the Http Request, current thread, current machine, state, user information, etc.

You can log context with every message, when transitioning, or just on exceptions. All logging libraries support reporting of context. It’s best to use structured logging for context, so you’ll be able to search and filter by it later.

5. Use Structured Logging

Structured Logging became extremely popular for a reason. As applications grow in size, their logs are growing with it. We need more sophisticated tools to find logs, aggregate them according to context and analyze them. Structured logging gives us the means to do just that. Even if you don’t use the benefits of structured logging immediately, consider this to be a long term investment.

6. Redact Sensitive Information

You should be aware that production logs shouldn’t contain sensitive or private information. That might include passwords, credit card numbers, social security numbers, etc. But it also might include private information like preferences and usage patterns. Although, according to your needs, perhaps this is exactly the kind of information you do want to log.

By setting minimum log level to “Warn” or “Error” in production, you are minimizing this problem, but even error logs can contain sensitive information. You can then scrub the data, or avoid sending it altogether.

You can find a very good list of additional best practices in this article by Jason Skowronski.

Summary

In this article, I tried to show a good bird’s eye view on modern logging practices in .NET. My goal was for the reader to make sense of the abundance of available technologies and when to use which. Hopefully, this helped you to make sense of things and now you can research further on a more specific technology.

NOTE: There’s a myriad of logging-related technologies out there. Tech to store logs, query logs and to visualize logs. The technologies described here are just to convey the types of solutions you can find.

Logging in C# .NET Modern-day Practices: The Complete Guide (2024)

FAQs

What is logging framework in C#? ›

Every logging frameworks associate by default a logging level to each message. The levels are usually Debug, Info, Warn, Error, Fatal or similar. Those are important to convey the type of information logged. Debug and Info show debug information and contextual information that's helpful to understand the current flow.

Which .NET function would you use to get a logger? ›

log4net is one of the most common external logging services available to . NET developers. The developers for log4net promise you can have logging integrated with your application within minutes, and it's true—setup is easy. log4net is available in NuGet, so it's just as easy to install as it is to code.

Which logging framework is best for .NET core? ›

The Best 1 of 6 Options Why?
Best .NET logging frameworksPriceHosting options
92 NLogFree-
82 SerilogFree-
75 log4netFree-
-- JSNLogFreeNo
1 more row
Nov 12, 2022

What are the 3 methods of logging? ›

There are three major groups of timber harvest practices; clearcutting, shelterwood and selection systems.

What are 4 types of logging? ›

Types of logs
  • Electrode resistivity devices.
  • Induction logging.
  • Microresistivity logs.
  • Spontaneous (SP) log.
Jul 6, 2015

What are the basic steps in logging? ›

Cut-to-length logging is the process of felling, delimbing, bucking, and sorting (pulpwood, sawlog, etc.) at the stump area, leaving limbs and tops in the forest. Mechanical harvesters fell the tree, delimb, and buck it, and place the resulting logs in bunks to be brought to the landing by a skidder or forwarder.

What are two types of logging methods? ›

Logging is generally categorized into two categories: selective and clear-cutting. Selective logging is selective because loggers choose only wood that is highly valued, such as mahogany. Clear-cutting is not selective.

What are the five levels of logging? ›

What are the standard log levels?
  • Emergency. Emergency logs are given the numerical value "0". ...
  • Alert. ...
  • Critical. ...
  • Error. ...
  • Warning. ...
  • Notice. ...
  • Informational. ...
  • Debug.

What are the best .NET logging frameworks? ›

  • NLog is one of the most popular, and one of the best-performing logging frameworks for . ...
  • Log4NET is a port of the popular and powerful Log4J logging framework for Java. ...
  • ELMAH is specifically designed for ASP.NET applications. ...
  • Elasticsearch is a fast search engine that is used to find data in large datasets.
Jan 20, 2021

What are the types of logger? ›

Logging Handlers or Appender

ConsoleHandler: It writes all the formatted log messages to the console. FileHandler: It writes the log message either to a single file or a group of rotating log files in the XML format. SocketHandler: It writes the log message to the remote TCP ports.

Where are .NET logs stored? ›

Most . NET programs write logs to a database or Windows Event Log if running in Windows and to the /var/log folder if running in Linux. There are security issues with flat files, but their use is also common.

What is the best logging method? ›

8 Log Management Best Practices
  • Implement Structured Logging.
  • Build Meaning and Context into Log Messages.
  • Avoid Logging Non-essential or Sensitive Data.
  • Capture Logs from Diverse Sources.
  • Aggregate and Centralize Your Log Data.
  • Index Logs for Querying and Analytics.
  • Configure Real-Time Log Monitoring and Alerts.
Nov 26, 2021

Why is .NET logging important? ›

Context is important to understand any issues that occur in an application. Using contextual items available in an application such as the request, current thread, state, user information and timestamp provides context to .

What are 5 things you can do to reduce the impact of logging? ›

  1. #1 Plant a tree. ...
  2. #2 Use less paper. ...
  3. #3 Recycle paper and cardboard. ...
  4. #4 Use recycled products. ...
  5. #5 Buy only sustainable wood products. ...
  6. #6 Don't buy products containing palm oil. ...
  7. #7 Reduce meat consumption. ...
  8. #8 Do not burn firewood excessively.
Mar 16, 2018

What is basic logging? ›

Basic Logging Tutorial. Logging is a means of tracking events that happen when some software runs. The software's developer adds logging calls to their code to indicate that certain events have occurred.

How do you solve logging problems? ›

Best Solutions to Illegal Logging
  1. Encouragement of forest stewardship. Among the best solutions to illegal logging, management is the promotion of forest stewardship programs. ...
  2. Stricter regulations on forest management. ...
  3. Legal purchases. ...
  4. Volunteer, donate and spread the word.

What is the purpose of logging? ›

What is logging? The purpose of logging is to track error reporting and related data in a centralized way. Logging should be used in big applications and it can be put to use in smaller apps, especially if they provide a crucial function.

Why is logging important? ›

Provides necessary materials – Logging is a main source of timber which is used for a number of human needs such as providing construction materials, flooring wood, furniture, fuel for industries and homes, sports goods and other kinds of commodities.

How many types of logging are there? ›

10 Types of Logging | Indeed.com.

What is common logging framework? ›

Common. Logging provides a basic logging abstraction for developers to code against that makes it easy to switch your application from one logging framework to the next via simple configuration. Common. Logging offers multiple ready-built adapters to support the most popular logging frameworks in the .

What is an example of data logging? ›

Data logging can be done manually by constant human observation. An example of this might be recording the temperature changes over the course of an hour in a centrally heated room using a timer, thermometer, pen and paper.

What are the features of logging? ›

Logging Features
  • a short descriptive message.
  • a timestamp of the event.
  • the source of the record.
  • the log controller.
  • a severity, specifying the importance of the record.
  • the host, system and instance name.
  • the server process.

What is the best log level? ›

The standard ranking of logging levels is as follows: ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF.

What is logger in .NET core? ›

In ASP.NET Core, logging providers store the logs. You can configure multiple logging providers for your application. The default ASP.NET Core configures the following logging providers: Console, Debug, EventSource, and EventLog (on Windows).

Can logging be a microservice? ›

The concept of logging is nothing new. It is commonly used for cross-cutting concerns in an application and has been in use for a long time. It is an essential component of any application – be it a monolithic or a microservice-based one.

Which design pattern is used in logging? ›

Logging is usually implemented with the Chain of responsibility pattern.

Is JSON good for logging? ›

JSON logging is the best format for storing your logs, and here's why. Usually, we log application data in a file. But we need a better framework. If we write logs as JSON, we can easily search fields with a JSON key.

What is a logger called? ›

The term lumberjack is primarily historical; logger is used by workers in the 21st century. When lumberjack is used, it usually refers to a logger from an earlier time before the advent of chainsaws, feller-bunchers and other modern logging equipment.

Which data base is used for logger? ›

Two types of database logging are supported: circular and archive. Each provides a different level of recovery capability: Circular logging. Archive logging.

How do I check network logs? ›

To the right of the address bar, click and then More tools > Developer tools. Chrome's Developer tools window opens. Click the Network tab. Enable the Preserve Log check box.

How long are network logs stored? ›

Current guidelines require that organizations retain all security incident reports and logs for at least six years.

How to create a log file in C# Web service? ›

Write a Log file in . Net Application
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. namespace BackToBasicProj.
  8. {
Aug 16, 2016

How do you do logging properly? ›

Logging Best Practices: The 13 You Should Know
  1. Don't Write Logs by Yourself (AKA Don't Reinvent the Wheel) ...
  2. Log at the Proper Level. ...
  3. Employ the Proper Log Category. ...
  4. Write Meaningful Log Messages. ...
  5. Write Log Messages in English. ...
  6. Add Context to Your Log Messages. ...
  7. Log in Machine Parseable Format.
Oct 15, 2019

What is the process of logging? ›

logging, process of harvesting trees, sawing them into appropriate lengths (bucking), and transporting them (skidding) to a sawmill. The different phases of this process vary with local conditions and technology.

How do I enable logging? ›

In Outlook, go to Tools > Options. On the Other tab, select Advanced Options. Select or clear the Enable logging (troubleshooting) check box.

Is logging a hard job? ›

Logging is a physically demanding job. Workers spend all day in the woods cutting up trees, often working in very high places while in a fast-paced environment. This type of job is definitely not for everyone, and not even for most people. But thankfully, there are those who embrace this type of work despite the risks.

Which tool is good for logging? ›

Splunk is one of the first commercial log centralizing tools, and the most popular. The typical deployment is on-premises (Splunk Enterprise), though it's also offered as a service (Splunk Cloud). You can send both logs and metrics to Splunk and analyze them together.

What is the main purpose of logging? ›

What is logging? The purpose of logging is to track error reporting and related data in a centralized way. Logging should be used in big applications and it can be put to use in smaller apps, especially if they provide a crucial function.

Why do we use logging? ›

Need for logging

While building applications, we often face errors that have to be debugged. So, with the help of logs, we can easily get information about what is happening in the application with a record of errors and unusual circ*mstances.

What is logging in debugging? ›

Debug logs are system-generated logs that are sent to your Dashboard along with every new conversation. They only appear if your developers have configured them in the SDK for a given game/app version. When configured, they appear under the metadata tab in the Issue details pane.

How do I run a logger command? ›

Examples
  1. To log a message indicating a system reboot, enter: logger System rebooted.
  2. To log a message contained in the /tmp/msg1 file, enter: logger -f /tmp/msg1.
  3. To log the daemon facility critical level messages, enter: logger -pdaemon.crit.

Top Articles
Latest Posts
Article information

Author: Stevie Stamm

Last Updated:

Views: 5610

Rating: 5 / 5 (60 voted)

Reviews: 83% of readers found this page helpful

Author information

Name: Stevie Stamm

Birthday: 1996-06-22

Address: Apt. 419 4200 Sipes Estate, East Delmerview, WY 05617

Phone: +342332224300

Job: Future Advertising Analyst

Hobby: Leather crafting, Puzzles, Leather crafting, scrapbook, Urban exploration, Cabaret, Skateboarding

Introduction: My name is Stevie Stamm, I am a colorful, sparkling, splendid, vast, open, hilarious, tender person who loves writing and wants to share my knowledge and understanding with you.