Skip to content

Commit

Permalink
Import and setup Serilog
Browse files Browse the repository at this point in the history
Co-authored-by: Adam Tao <[email protected]>
  • Loading branch information
razzmatazz and tcx4c70 committed Feb 15, 2024
1 parent 4f94c08 commit 5ca02fc
Show file tree
Hide file tree
Showing 8 changed files with 62 additions and 17 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).

## [Unreleased]
* Rework logging to be based on Serilog
- PR by @tcx4c70 in https://github.com/razzmatazz/csharp-language-server/pull/134
* More refactoring by @tcx4c70
- PR by @tcx4c70 in https://github.com/razzmatazz/csharp-language-server/pull/102
* Change package management to CPM
Expand Down
3 changes: 3 additions & 0 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -35,5 +35,8 @@
<PackageVersion Include="NUnit" Version="3.13.2" />
<PackageVersion Include="NUnit3TestAdapter" Version="4.0.0" />
<PackageVersion Include="System.Collections.Immutable" Version="7.0.0" />
<PackageVersion Include="Serilog" Version="3.0.1" />
<PackageVersion Include="Serilog.Sinks.Console" Version="4.1.0" />
<PackageVersion Include="Serilog.Sinks.Async" Version="1.5.0" />
</ItemGroup>
</Project>
3 changes: 3 additions & 0 deletions src/CSharpLanguageServer/CSharpLanguageServer.fsproj
Original file line number Diff line number Diff line change
Expand Up @@ -75,5 +75,8 @@
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" />
<PackageReference Include="Microsoft.CodeAnalysis.Features" />
<PackageReference Include="Microsoft.CodeAnalysis.Workspaces.MSBuild" />
<PackageReference Include="Serilog" />
<PackageReference Include="Serilog.Sinks.Console" />
<PackageReference Include="Serilog.Sinks.Async" />
</ItemGroup>
</Project>
3 changes: 3 additions & 0 deletions src/CSharpLanguageServer/Handlers/CodeAction.fs
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,12 @@ open Microsoft.CodeAnalysis.Text
open CSharpLanguageServer
open CSharpLanguageServer.State
open CSharpLanguageServer.RoslynHelpers
open CSharpLanguageServer.Logging

[<RequireQualifiedAccess>]
module CodeAction =
let private logger = LogProvider.getLoggerByName "CodeAction"

type CSharpCodeActionResolutionData = {
TextDocumentUri: string
Range: Range
Expand Down
3 changes: 3 additions & 0 deletions src/CSharpLanguageServer/Handlers/Rename.fs
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,12 @@ open Microsoft.CodeAnalysis.Classification
open CSharpLanguageServer
open CSharpLanguageServer.State
open CSharpLanguageServer.RoslynHelpers
open CSharpLanguageServer.Logging

[<RequireQualifiedAccess>]
module Rename =
let private logger = LogProvider.getLoggerByName "CodeAction"

let provider (clientCapabilities: ClientCapabilities option) : U2<bool, Types.RenameOptions> option =
let clientSupportsRenameOptions =
clientCapabilities
Expand Down
45 changes: 34 additions & 11 deletions src/CSharpLanguageServer/Program.fs
Original file line number Diff line number Diff line change
@@ -1,9 +1,15 @@
module CSharpLanguageServer.Program

open Argu
open System
open System.Reflection
open CSharpLanguageServer.Types
open CSharpLanguageServer.Lsp
open Serilog
open Serilog.Core
open Serilog.Events

open CSharpLanguageServer.Logging

[<EntryPoint>]
let entry args =
Expand All @@ -16,20 +22,37 @@ let entry args =
(Assembly.GetExecutingAssembly().GetName().Version |> string)
exit 0)

let parseLogLevel (s: string) =
match s.ToLowerInvariant() with
| "error" -> Ionide.LanguageServerProtocol.Types.MessageType.Error
| "warning" -> Ionide.LanguageServerProtocol.Types.MessageType.Warning
| "info" -> Ionide.LanguageServerProtocol.Types.MessageType.Info
| "log" -> Ionide.LanguageServerProtocol.Types.MessageType.Log
| _ -> Ionide.LanguageServerProtocol.Types.MessageType.Log
let logLevelArg =
serverArgs.TryGetResult(<@ Options.CLIArguments.LogLevel @>)
|> Option.defaultValue "log"

let logLevel =
match logLevelArg with
| "error" -> LogEventLevel.Error
| "warning" -> LogEventLevel.Warning
| "info" -> LogEventLevel.Information
| "log" -> LogEventLevel.Verbose
| _ -> LogEventLevel.Information

let logConfig =
LoggerConfiguration()
.MinimumLevel.ControlledBy(LoggingLevelSwitch(logLevel))
.Enrich.FromLogContext()
.WriteTo.Async(fun conf ->
conf.Console(
outputTemplate =
"[{Timestamp:HH:mm:ss.fff} {Level:u3}] [{SourceContext}] {Message:lj}{NewLine}{Exception}",
// Redirect all logs to stderr since stdout is used to communicate with client.
standardErrorFromLevel = Nullable<_>(LogEventLevel.Verbose),
theme = Serilog.Sinks.SystemConsole.Themes.AnsiConsoleTheme.Code
)
|> ignore)

Log.Logger <- logConfig.CreateLogger()

// default the verbosity to warning
let settings: ServerSettings = {
SolutionPath = serverArgs.TryGetResult(<@ Options.CLIArguments.Solution @>)
LogLevel = serverArgs.TryGetResult(<@ Options.CLIArguments.LogLevel @>)
|> Option.defaultValue "log"
|> parseLogLevel
LogLevel = logLevelArg
}

Server.start CSharpLanguageServer.Server.setupServerHandlers
Expand Down
16 changes: 12 additions & 4 deletions src/CSharpLanguageServer/Server.fs
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ open Ionide.LanguageServerProtocol.Server
open Ionide.LanguageServerProtocol.Types

open CSharpLanguageServer
open CSharpLanguageServer.Logging
open CSharpLanguageServer.RoslynHelpers
open CSharpLanguageServer.State
open CSharpLanguageServer.Lsp
Expand All @@ -50,6 +51,8 @@ let getDotnetCliVersion () : string =
"(could not launch `dotnet --version`)"

let setupServerHandlers settings (lspClient: LspClient) =
let logger = LogProvider.getLoggerByName "Server"

let success = LspResult.success
let mutable logMessageCurrent: AsyncLogFn = fun _ -> async { return() }
let logMessageInvoke m = logMessageCurrent(m)
Expand Down Expand Up @@ -101,13 +104,18 @@ let setupServerHandlers settings (lspClient: LspClient) =
do stateActor.Post(PeriodicTimerTick)),
null, dueTime=1000, period=250))

let logMessageWithLevel l message = async {
let messageParams = { Type = l ; Message = "csharp-ls: " + message }
// TODO: setup Serilog Sink instead
let logMessage message = async {
let messageParams = { Type = MessageType.Log ; Message = "csharp-ls: " + message }
do! lspClient.WindowShowMessage messageParams
logger.trace (Log.setMessage message)
}

let logMessage = logMessageWithLevel MessageType.Log
let infoMessage = logMessageWithLevel MessageType.Info
let infoMessage message = async {
let messageParams = { Type = MessageType.Info ; Message = "csharp-ls: " + message }
do! lspClient.WindowShowMessage messageParams
logger.info (Log.setMessage message)
}

let handleInitialize (scope: ServerRequestScope) (p: InitializeParams): AsyncLspResult<InitializeResult> = async {
do! infoMessage (sprintf "initializing, csharp-ls version %s; cwd: \"%s\""
Expand Down
4 changes: 2 additions & 2 deletions src/CSharpLanguageServer/Types.fs
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@ open Ionide.LanguageServerProtocol.Types

type ServerSettings =
{ SolutionPath: string option
LogLevel: MessageType }
LogLevel: string }

static member Default: ServerSettings =
{ SolutionPath = None
LogLevel = MessageType.Log }
LogLevel = "log" }

type CSharpMetadataInformation =
{ ProjectName: string
Expand Down

0 comments on commit 5ca02fc

Please sign in to comment.