From 1fc07e742fa7322be55f6a10b502de44de32b39a Mon Sep 17 00:00:00 2001 From: Duke <40759437+dukesteen@users.noreply.github.com> Date: Wed, 2 Mar 2022 20:08:51 +0100 Subject: [PATCH] Guides for Serilog and EFCore (#2134) * Add serilog guide * added suggestions from Rozen * Add efcore guide * Fix review changes * Fix grammatical errors & review points --- docs/guides/other_libs/efcore.md | 61 ++++++++++++++++++ .../other_libs/images/serilog_output.png | Bin 0 -> 40492 bytes .../other_libs/samples/ConfiguringSerilog.cs | 36 +++++++++++ .../samples/DbContextDepInjection.cs | 9 +++ .../other_libs/samples/DbContextSample.cs | 19 ++++++ .../samples/InteractionModuleDISample.cs | 20 ++++++ .../other_libs/samples/LogDebugSample.cs | 1 + .../other_libs/samples/ModifyLogMethod.cs | 15 +++++ docs/guides/other_libs/serilog.md | 45 +++++++++++++ docs/guides/toc.yml | 8 ++- 10 files changed, 213 insertions(+), 1 deletion(-) create mode 100644 docs/guides/other_libs/efcore.md create mode 100644 docs/guides/other_libs/images/serilog_output.png create mode 100644 docs/guides/other_libs/samples/ConfiguringSerilog.cs create mode 100644 docs/guides/other_libs/samples/DbContextDepInjection.cs create mode 100644 docs/guides/other_libs/samples/DbContextSample.cs create mode 100644 docs/guides/other_libs/samples/InteractionModuleDISample.cs create mode 100644 docs/guides/other_libs/samples/LogDebugSample.cs create mode 100644 docs/guides/other_libs/samples/ModifyLogMethod.cs create mode 100644 docs/guides/other_libs/serilog.md diff --git a/docs/guides/other_libs/efcore.md b/docs/guides/other_libs/efcore.md new file mode 100644 index 000000000..ffdea42aa --- /dev/null +++ b/docs/guides/other_libs/efcore.md @@ -0,0 +1,61 @@ +--- +uid: Guides.OtherLibs.EFCore +title: EFCore +--- + +# Entity Framework Core + +In this guide we will set up EFCore with a PostgreSQL database. Information on other databases will be at the bottom of this page. + +## Prerequisites + +- A simple bot with dependency injection configured +- A running PostgreSQL instance +- [EFCore CLI tools](https://docs.microsoft.com/en-us/ef/core/cli/dotnet#installing-the-tools) + +## Downloading the required packages + +You can install the following packages through your IDE or go to the nuget link to grab the dotnet cli command. + +|Name|Link| +|--|--| +| `Microsoft.EntityFrameworkCore` | [link](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore) | +| `Npgsql.EntityFrameworkCore.PostgreSQL` | [link](https://www.nuget.org/packages/Npgsql.EntityFrameworkCore.PostgreSQL)| + +## Configuring the DbContext + +To use EFCore, you need a DbContext to access everything in your database. The DbContext will look like this. Here is an example entity to show you how you can add more entities yourself later on. + +[!code-csharp[DBContext Sample](samples/DbContextSample.cs)] + +> [!NOTE] +> To learn more about creating the EFCore model, visit the following [link](https://docs.microsoft.com/en-us/ef/core/get-started/overview/first-app?tabs=netcore-cli#create-the-model) + +## Adding the DbContext to your Dependency Injection container + +To add your newly created DbContext to your Dependency Injection container, simply use the extension method provided by EFCore to add the context to your container. It should look something like this + +[!code-csharp[DBContext Dependency Injection](samples/DbContextDepInjection.cs)] + +> [!NOTE] +> You can find out how to get your connection string [here](https://www.connectionstrings.com/npgsql/standard/) + +## Migrations + +Before you can start using your DbContext, you have to migrate the changes you've made in your code to your actual database. +To learn more about migrations, visit the official Microsoft documentation [here](https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/?tabs=dotnet-core-cli) + +## Using the DbContext + +You can now use the DbContext wherever you can inject it. Here's an example on injecting it into an interaction command module. + +[!code-csharp[DBContext injected into interaction module](samples/InteractionModuleDISample.cs)] + +## Using a different database provider + +Here's a couple of popular database providers for EFCore and links to tutorials on how to set them up. The only thing that usually changes is the provider inside of your `DbContextOptions` + +| Provider | Link | +|--|--| +| MySQL | [link](https://dev.mysql.com/doc/connector-net/en/connector-net-entityframework-core-example.html) | +| SQLite | [link](https://docs.microsoft.com/en-us/ef/core/get-started/overview/first-app?tabs=netcore-cli) | diff --git a/docs/guides/other_libs/images/serilog_output.png b/docs/guides/other_libs/images/serilog_output.png new file mode 100644 index 0000000000000000000000000000000000000000..67de0fa34627a4854bb9107d6367d4074c2aa844 GIT binary patch literal 40492 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 literal 0 HcmV?d00001 diff --git a/docs/guides/other_libs/samples/ConfiguringSerilog.cs b/docs/guides/other_libs/samples/ConfiguringSerilog.cs new file mode 100644 index 000000000..0d4706424 --- /dev/null +++ b/docs/guides/other_libs/samples/ConfiguringSerilog.cs @@ -0,0 +1,36 @@ +using Discord; +using Serilog; +using Serilog.Events; + +public class Program +{ + static void Main(string[] args) => new Program().MainAsync().GetAwaiter().GetResult(); + + public async Task MainAsync() + { + Log.Logger = new LoggerConfiguration() + .MinimumLevel.Verbose() + .Enrich.FromLogContext() + .WriteTo.Console() + .CreateLogger(); + + _client = new DiscordSocketClient(); + + _client.Log += LogAsync; + + // You can assign your bot token to a string, and pass that in to connect. + // This is, however, insecure, particularly if you plan to have your code hosted in a public repository. + var token = "token"; + + // Some alternative options would be to keep your token in an Environment Variable or a standalone file. + // var token = Environment.GetEnvironmentVariable("NameOfYourEnvironmentVariable"); + // var token = File.ReadAllText("token.txt"); + // var token = JsonConvert.DeserializeObject(File.ReadAllText("config.json")).Token; + + await _client.LoginAsync(TokenType.Bot, token); + await _client.StartAsync(); + + // Block this task until the program is closed. + await Task.Delay(Timeout.Infinite); + } +} diff --git a/docs/guides/other_libs/samples/DbContextDepInjection.cs b/docs/guides/other_libs/samples/DbContextDepInjection.cs new file mode 100644 index 000000000..5d989995b --- /dev/null +++ b/docs/guides/other_libs/samples/DbContextDepInjection.cs @@ -0,0 +1,9 @@ +private static ServiceProvider ConfigureServices() +{ + return new ServiceCollection() + .AddDbContext( + options => options.UseNpgsql("Your connection string") + ) + [...] + .BuildServiceProvider(); +} diff --git a/docs/guides/other_libs/samples/DbContextSample.cs b/docs/guides/other_libs/samples/DbContextSample.cs new file mode 100644 index 000000000..96104ae53 --- /dev/null +++ b/docs/guides/other_libs/samples/DbContextSample.cs @@ -0,0 +1,19 @@ +// ApplicationDbContext.cs +using Microsoft.EntityFrameworkCore; + +public class ApplicationDbContext : DbContext +{ + public ApplicationDbContext(DbContextOptions options) : base(options) + { + + } + + public DbSet Users { get; set; } = null!; +} + +// UserEntity.cs +public class UserEntity +{ + public ulong Id { get; set; } + public string Name { get; set; } +} diff --git a/docs/guides/other_libs/samples/InteractionModuleDISample.cs b/docs/guides/other_libs/samples/InteractionModuleDISample.cs new file mode 100644 index 000000000..777d6aef0 --- /dev/null +++ b/docs/guides/other_libs/samples/InteractionModuleDISample.cs @@ -0,0 +1,20 @@ +using Discord; + +public class SampleModule : InteractionModuleBase +{ + private readonly ApplicationDbContext _db; + + public SampleModule(ApplicationDbContext db) + { + _db = db; + } + + [SlashCommand("sample", "sample")] + public async Task Sample() + { + // Do stuff with your injected DbContext + var user = _db.Users.FirstOrDefault(x => x.Id == Context.User.Id); + + ... + } +} diff --git a/docs/guides/other_libs/samples/LogDebugSample.cs b/docs/guides/other_libs/samples/LogDebugSample.cs new file mode 100644 index 000000000..e796e207a --- /dev/null +++ b/docs/guides/other_libs/samples/LogDebugSample.cs @@ -0,0 +1 @@ +Log.Debug("Your log message, with {Variables}!", 10); // This will output "[21:51:00 DBG] Your log message, with 10!" diff --git a/docs/guides/other_libs/samples/ModifyLogMethod.cs b/docs/guides/other_libs/samples/ModifyLogMethod.cs new file mode 100644 index 000000000..0f7c11daf --- /dev/null +++ b/docs/guides/other_libs/samples/ModifyLogMethod.cs @@ -0,0 +1,15 @@ +private static async Task LogAsync(LogMessage message) +{ + var severity = message.Severity switch + { + LogSeverity.Critical => LogEventLevel.Fatal, + LogSeverity.Error => LogEventLevel.Error, + LogSeverity.Warning => LogEventLevel.Warning, + LogSeverity.Info => LogEventLevel.Information, + LogSeverity.Verbose => LogEventLevel.Verbose, + LogSeverity.Debug => LogEventLevel.Debug, + _ => LogEventLevel.Information + }; + Log.Write(severity, message.Exception, "[{Source}] {Message}", message.Source, message.Message); + await Task.CompletedTask; +} diff --git a/docs/guides/other_libs/serilog.md b/docs/guides/other_libs/serilog.md new file mode 100644 index 000000000..5086b4b85 --- /dev/null +++ b/docs/guides/other_libs/serilog.md @@ -0,0 +1,45 @@ +--- +uid: Guides.OtherLibs.Serilog +title: Serilog +--- + +# Configuring serilog + +## Prerequisites + +- A basic working bot with a logging method as described in [Creating your first bot](xref:Guides.GettingStarted.FirstBot) + +## Installing the Serilog package + +You can install the following packages through your IDE or go to the nuget link to grab the dotnet cli command. + +|Name|Link| +|--|--| +|`Serilog.Extensions.Logging`| [link](https://www.nuget.org/packages/Serilog.Extensions.Logging)| +|`Serilog.Sinks.Console`| [link](https://www.nuget.org/packages/Serilog.Sinks.Console)| + +## Configuring Serilog + +Serilog will be configured at the top of your async Main method, it looks like this + +[!code-csharp[Configuring serilog](samples/ConfiguringSerilog.cs)] + +## Modifying your logging method + +For Serilog to log Discord events correctly, we have to map the Discord `LogSeverity` to the Serilog `LogEventLevel`. You can modify your log method to look like this. + +[!code-csharp[Modifying your log method](samples/ModifyLogMethod.cs)] + +## Testing + +If you run your application now, you should see something similar to this +![Serilog output](images/serilog_output.png) + +## Using your new logger in other places + +Now that you have set up Serilog, you can use it everywhere in your application by simply calling + +[!code-csharp[Log debug sample](samples/LogDebugSample.cs)] + +> [!NOTE] +> Depending on your configured log level, the log messages may or may not show up in your console. Refer to [Serilog's github page](https://github.com/serilog/serilog/wiki/Configuration-Basics#minimum-level) for more information about log levels. diff --git a/docs/guides/toc.yml b/docs/guides/toc.yml index 1616363b7..b1a6b4721 100644 --- a/docs/guides/toc.yml +++ b/docs/guides/toc.yml @@ -95,7 +95,7 @@ topicUid: Guides.MessageComponents.TextInputs - name: Advanced Concepts topicUid: Guides.MessageComponents.Advanced -- name: Modal Basics +- name: Modal Basics items: - name: Introduction topicUid: Guides.Modals.Intro @@ -109,6 +109,12 @@ topicUid: Guides.GuildEvents.GettingUsers - name: Modifying Events topicUid: Guides.GuildEvents.Modifying +- name: Working with other libraries + items: + - name: Serilog + topicUid: Guides.OtherLibs.Serilog + - name: EFCore + topicUid: Guides.OtherLibs.EFCore - name: Emoji topicUid: Guides.Emoji - name: Voice