Skip to content

Commit d59d8b9

Browse files
committed
- Initial commit
1 parent c7eef27 commit d59d8b9

36 files changed

+1546
-2
lines changed

.editorconfig

+200
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,200 @@
1+
# http://EditorConfig.org
2+
3+
# This file is the top-most EditorConfig file
4+
root = true
5+
6+
# All Files
7+
[*]
8+
charset = utf-8
9+
end_of_line = crlf
10+
indent_style = space
11+
indent_size = 4
12+
insert_final_newline = false
13+
trim_trailing_whitespace = true
14+
15+
# Solution Files
16+
[*.sln]
17+
indent_style = tab
18+
19+
# XML Project Files
20+
[*.{csproj,vbproj,vcxproj,vcxproj.filters,proj,projitems,shproj}]
21+
indent_size = 2
22+
23+
# Configuration Files
24+
[*.{json,xml,yml,config,props,targets,nuspec,resx,ruleset,vsixmanifest,vsct}]
25+
indent_size = 2
26+
27+
# Markdown Files
28+
[*.md]
29+
trim_trailing_whitespace = false
30+
31+
# Web Files
32+
[*.{htm,html,js,ts,css,scss,less}]
33+
indent_size = 2
34+
insert_final_newline = true
35+
36+
# Bash Files
37+
[*.sh]
38+
end_of_line = lf
39+
40+
# Dotnet Code Style Settings
41+
# See https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-code-style-settings-reference
42+
# See http://kent-boogaart.com/blog/editorconfig-reference-for-c-developers
43+
[*.{cs,csx,cake,vb}]
44+
dotnet_sort_system_directives_first = true:warning
45+
dotnet_style_coalesce_expression = true:warning
46+
dotnet_style_collection_initializer = true:warning
47+
dotnet_style_explicit_tuple_names = true:warning
48+
dotnet_style_null_propagation = true:warning
49+
dotnet_style_object_initializer = true:warning
50+
dotnet_style_predefined_type_for_locals_parameters_members = true:warning
51+
dotnet_style_predefined_type_for_member_access = true:warning
52+
dotnet_style_qualification_for_event = true:warning
53+
dotnet_style_qualification_for_field = true:warning
54+
dotnet_style_qualification_for_method = true:warning
55+
dotnet_style_qualification_for_property = true:warning
56+
57+
# Naming Symbols
58+
# constant_fields - Define constant fields
59+
dotnet_naming_symbols.constant_fields.applicable_kinds = field
60+
dotnet_naming_symbols.constant_fields.required_modifiers = const
61+
# non_private_readonly_fields - Define public, internal and protected readonly fields
62+
dotnet_naming_symbols.non_private_readonly_fields.applicable_accessibilities = public, internal, protected
63+
dotnet_naming_symbols.non_private_readonly_fields.applicable_kinds = field
64+
dotnet_naming_symbols.non_private_readonly_fields.required_modifiers = readonly
65+
# static_readonly_fields - Define static and readonly fields
66+
dotnet_naming_symbols.static_readonly_fields.applicable_kinds = field
67+
dotnet_naming_symbols.static_readonly_fields.required_modifiers = static, readonly
68+
# private_readonly_fields - Define private readonly fields
69+
dotnet_naming_symbols.private_readonly_fields.applicable_accessibilities = private
70+
dotnet_naming_symbols.private_readonly_fields.applicable_kinds = field
71+
dotnet_naming_symbols.private_readonly_fields.required_modifiers = readonly
72+
# public_internal_fields - Define public and internal fields
73+
dotnet_naming_symbols.public_internal_fields.applicable_accessibilities = public, internal
74+
dotnet_naming_symbols.public_internal_fields.applicable_kinds = field
75+
# private_protected_fields - Define private and protected fields
76+
dotnet_naming_symbols.private_protected_fields.applicable_accessibilities = private, protected
77+
dotnet_naming_symbols.private_protected_fields.applicable_kinds = field
78+
# public_symbols - Define any public symbol
79+
dotnet_naming_symbols.public_symbols.applicable_accessibilities = public, internal, protected, protected_internal
80+
dotnet_naming_symbols.public_symbols.applicable_kinds = method, property, event, delegate
81+
# parameters - Defines any parameter
82+
dotnet_naming_symbols.parameters.applicable_kinds = parameter
83+
# non_interface_types - Defines class, struct, enum and delegate types
84+
dotnet_naming_symbols.non_interface_types.applicable_kinds = class, struct, enum, delegate
85+
# interface_types - Defines interfaces
86+
dotnet_naming_symbols.interface_types.applicable_kinds = interface
87+
88+
# Naming Styles
89+
# camel_case - Define the camelCase style
90+
dotnet_naming_style.camel_case.capitalization = camel_case
91+
# pascal_case - Define the Pascal_case style
92+
dotnet_naming_style.pascal_case.capitalization = pascal_case
93+
# first_upper - The first character must start with an upper-case character
94+
dotnet_naming_style.first_upper.capitalization = first_word_upper
95+
# prefix_interface_interface_with_i - Interfaces must be PascalCase and the first character of an interface must be an 'I'
96+
dotnet_naming_style.prefix_interface_interface_with_i.capitalization = pascal_case
97+
dotnet_naming_style.prefix_interface_interface_with_i.required_prefix = I
98+
99+
# Naming Rules
100+
# Constant fields must be PascalCase
101+
dotnet_naming_rule.constant_fields_must_be_pascal_case.severity = warning
102+
dotnet_naming_rule.constant_fields_must_be_pascal_case.symbols = constant_fields
103+
dotnet_naming_rule.constant_fields_must_be_pascal_case.style = pascal_case
104+
# Public, internal and protected readonly fields must be PascalCase
105+
dotnet_naming_rule.non_private_readonly_fields_must_be_pascal_case.severity = warning
106+
dotnet_naming_rule.non_private_readonly_fields_must_be_pascal_case.symbols = non_private_readonly_fields
107+
dotnet_naming_rule.non_private_readonly_fields_must_be_pascal_case.style = pascal_case
108+
# Static readonly fields must be PascalCase
109+
dotnet_naming_rule.static_readonly_fields_must_be_pascal_case.severity = warning
110+
dotnet_naming_rule.static_readonly_fields_must_be_pascal_case.symbols = static_readonly_fields
111+
dotnet_naming_rule.static_readonly_fields_must_be_pascal_case.style = pascal_case
112+
# Private readonly fields must be camelCase
113+
dotnet_naming_rule.private_readonly_fields_must_be_camel_case.severity = warning
114+
dotnet_naming_rule.private_readonly_fields_must_be_camel_case.symbols = private_readonly_fields
115+
dotnet_naming_rule.private_readonly_fields_must_be_camel_case.style = camel_case
116+
# Public and internal fields must be PascalCase
117+
dotnet_naming_rule.public_internal_fields_must_be_pascal_case.severity = warning
118+
dotnet_naming_rule.public_internal_fields_must_be_pascal_case.symbols = public_internal_fields
119+
dotnet_naming_rule.public_internal_fields_must_be_pascal_case.style = pascal_case
120+
# Private and protected fields must be camelCase
121+
dotnet_naming_rule.private_protected_fields_must_be_camel_case.severity = warning
122+
dotnet_naming_rule.private_protected_fields_must_be_camel_case.symbols = private_protected_fields
123+
dotnet_naming_rule.private_protected_fields_must_be_camel_case.style = camel_case
124+
# Public members must be capitalized
125+
dotnet_naming_rule.public_members_must_be_capitalized.severity = warning
126+
dotnet_naming_rule.public_members_must_be_capitalized.symbols = public_symbols
127+
dotnet_naming_rule.public_members_must_be_capitalized.style = first_upper
128+
# Parameters must be camelCase
129+
dotnet_naming_rule.parameters_must_be_camel_case.severity = warning
130+
dotnet_naming_rule.parameters_must_be_camel_case.symbols = parameters
131+
dotnet_naming_rule.parameters_must_be_camel_case.style = camel_case
132+
# Class, struct, enum and delegates must be PascalCase
133+
dotnet_naming_rule.non_interface_types_must_be_pascal_case.severity = warning
134+
dotnet_naming_rule.non_interface_types_must_be_pascal_case.symbols = non_interface_types
135+
dotnet_naming_rule.non_interface_types_must_be_pascal_case.style = pascal_case
136+
# Interfaces must be PascalCase and start with an 'I'
137+
dotnet_naming_rule.interface_types_must_be_prefixed_with_i.severity = warning
138+
dotnet_naming_rule.interface_types_must_be_prefixed_with_i.symbols = interface_types
139+
dotnet_naming_rule.interface_types_must_be_prefixed_with_i.style = prefix_interface_interface_with_i
140+
141+
# C# Code Style Settings
142+
# See https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-code-style-settings-reference
143+
# See http://kent-boogaart.com/blog/editorconfig-reference-for-c-developers
144+
[*.cs,csx,cake]
145+
# Indentation Options
146+
csharp_indent_block_contents = true:warning
147+
csharp_indent_braces = false:warning
148+
csharp_indent_case_contents = true:warning
149+
csharp_indent_labels = no_change:warning
150+
csharp_indent_switch_labels = true:warning
151+
# Style Options
152+
csharp_style_conditional_delegate_call = true:warning
153+
csharp_style_expression_bodied_accessors = true:warning
154+
csharp_style_expression_bodied_constructors = true:warning
155+
csharp_style_expression_bodied_indexers = true:warning
156+
csharp_style_expression_bodied_methods = true:warning
157+
csharp_style_expression_bodied_operators = true:warning
158+
csharp_style_expression_bodied_properties = true:warning
159+
csharp_style_inlined_variable_declaration = true:warning
160+
csharp_style_pattern_matching_over_as_with_null_check = true:warning
161+
csharp_style_pattern_matching_over_is_with_cast_check = true:warning
162+
csharp_style_throw_expression = true:warning
163+
csharp_style_var_elsewhere = true:warning
164+
csharp_style_var_for_built_in_types = true:warning
165+
csharp_style_var_when_type_is_apparent = true:warning
166+
# New Line Options
167+
csharp_new_line_before_catch = true:warning
168+
csharp_new_line_before_else = true:warning
169+
csharp_new_line_before_finally = true:warning
170+
csharp_new_line_before_members_in_anonymous_types = true:warning
171+
csharp_new_line_before_members_in_object_initializers = true:warning
172+
# BUG: Warning level cannot be set https://github.com/dotnet/roslyn/issues/18010
173+
csharp_new_line_before_open_brace = all
174+
csharp_new_line_between_query_expression_clauses = true:warning
175+
# Spacing Options
176+
csharp_space_after_cast = false:warning
177+
csharp_space_after_colon_in_inheritance_clause = true:warning
178+
csharp_space_after_comma = true:warning
179+
csharp_space_after_dot = false:warning
180+
csharp_space_after_keywords_in_control_flow_statements = true:warning
181+
csharp_space_after_semicolon_in_for_statement = true:warning
182+
csharp_space_around_binary_operators = before_and_after:warning
183+
csharp_space_around_declaration_statements = do_not_ignore:warning
184+
csharp_space_before_colon_in_inheritance_clause = true:warning
185+
csharp_space_before_comma = false:warning
186+
csharp_space_before_dot = false:warning
187+
csharp_space_before_semicolon_in_for_statement = false:warning
188+
csharp_space_before_open_square_brackets = false:warning
189+
csharp_space_between_empty_square_brackets = false:warning
190+
csharp_space_between_method_declaration_name_and_open_parenthesis = false:warning
191+
csharp_space_between_method_declaration_parameter_list_parentheses = false:warning
192+
csharp_space_between_method_declaration_empty_parameter_list_parentheses = false:warning
193+
csharp_space_between_method_call_name_and_opening_parenthesis = false:warning
194+
csharp_space_between_method_call_parameter_list_parentheses = false:warning
195+
csharp_space_between_method_call_empty_parameter_list_parentheses = false:warning
196+
csharp_space_between_parentheses = expressions:warning
197+
csharp_space_between_square_brackets = false:warning
198+
# Wrapping Options
199+
csharp_preserve_single_line_blocks = true:warning
200+
csharp_preserve_single_line_statements = false:warning

.gitignore

+2-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
[Dd]ebugPublic/
1818
[Rr]elease/
1919
[Rr]eleases/
20+
[Pp]ublish[Oo]utput/
2021
x64/
2122
x86/
2223
bld/
@@ -285,4 +286,4 @@ __pycache__/
285286
*.btp.cs
286287
*.btm.cs
287288
*.odx.cs
288-
*.xsd.cs
289+
*.xsd.cs

BlazorLogging.sln

+64
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
2+
Microsoft Visual Studio Solution File, Format Version 12.00
3+
# Visual Studio 15
4+
VisualStudioVersion = 15.0.26124.0
5+
MinimumVisualStudioVersion = 15.0.26124.0
6+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{B286BCBD-DAD8-4DE7-9334-3DE18DF233AF}"
7+
EndProject
8+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{20DAA632-F8AD-4C5F-9E5F-FC82B7CB56A7}"
9+
EndProject
10+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BlazorLogging", "src\BlazorLogging\BlazorLogging.csproj", "{9378C7BF-0899-4835-B8FB-099292C8C63D}"
11+
EndProject
12+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{8A34FDEB-D488-4AE3-887B-8254B33C7A13}"
13+
ProjectSection(SolutionItems) = preProject
14+
README.md = README.md
15+
EndProjectSection
16+
EndProject
17+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BlazorLogging.Test", "test\BlazorLogging.Test\BlazorLogging.Test.csproj", "{C4BB6A39-28E6-454D-8679-92562CEAD0A9}"
18+
EndProject
19+
Global
20+
GlobalSection(SolutionConfigurationPlatforms) = preSolution
21+
Debug|Any CPU = Debug|Any CPU
22+
Debug|x64 = Debug|x64
23+
Debug|x86 = Debug|x86
24+
Release|Any CPU = Release|Any CPU
25+
Release|x64 = Release|x64
26+
Release|x86 = Release|x86
27+
EndGlobalSection
28+
GlobalSection(ProjectConfigurationPlatforms) = postSolution
29+
{9378C7BF-0899-4835-B8FB-099292C8C63D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
30+
{9378C7BF-0899-4835-B8FB-099292C8C63D}.Debug|Any CPU.Build.0 = Debug|Any CPU
31+
{9378C7BF-0899-4835-B8FB-099292C8C63D}.Debug|x64.ActiveCfg = Debug|Any CPU
32+
{9378C7BF-0899-4835-B8FB-099292C8C63D}.Debug|x64.Build.0 = Debug|Any CPU
33+
{9378C7BF-0899-4835-B8FB-099292C8C63D}.Debug|x86.ActiveCfg = Debug|Any CPU
34+
{9378C7BF-0899-4835-B8FB-099292C8C63D}.Debug|x86.Build.0 = Debug|Any CPU
35+
{9378C7BF-0899-4835-B8FB-099292C8C63D}.Release|Any CPU.ActiveCfg = Release|Any CPU
36+
{9378C7BF-0899-4835-B8FB-099292C8C63D}.Release|Any CPU.Build.0 = Release|Any CPU
37+
{9378C7BF-0899-4835-B8FB-099292C8C63D}.Release|x64.ActiveCfg = Release|Any CPU
38+
{9378C7BF-0899-4835-B8FB-099292C8C63D}.Release|x64.Build.0 = Release|Any CPU
39+
{9378C7BF-0899-4835-B8FB-099292C8C63D}.Release|x86.ActiveCfg = Release|Any CPU
40+
{9378C7BF-0899-4835-B8FB-099292C8C63D}.Release|x86.Build.0 = Release|Any CPU
41+
{C4BB6A39-28E6-454D-8679-92562CEAD0A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
42+
{C4BB6A39-28E6-454D-8679-92562CEAD0A9}.Debug|Any CPU.Build.0 = Debug|Any CPU
43+
{C4BB6A39-28E6-454D-8679-92562CEAD0A9}.Debug|x64.ActiveCfg = Debug|Any CPU
44+
{C4BB6A39-28E6-454D-8679-92562CEAD0A9}.Debug|x64.Build.0 = Debug|Any CPU
45+
{C4BB6A39-28E6-454D-8679-92562CEAD0A9}.Debug|x86.ActiveCfg = Debug|Any CPU
46+
{C4BB6A39-28E6-454D-8679-92562CEAD0A9}.Debug|x86.Build.0 = Debug|Any CPU
47+
{C4BB6A39-28E6-454D-8679-92562CEAD0A9}.Release|Any CPU.ActiveCfg = Release|Any CPU
48+
{C4BB6A39-28E6-454D-8679-92562CEAD0A9}.Release|Any CPU.Build.0 = Release|Any CPU
49+
{C4BB6A39-28E6-454D-8679-92562CEAD0A9}.Release|x64.ActiveCfg = Release|Any CPU
50+
{C4BB6A39-28E6-454D-8679-92562CEAD0A9}.Release|x64.Build.0 = Release|Any CPU
51+
{C4BB6A39-28E6-454D-8679-92562CEAD0A9}.Release|x86.ActiveCfg = Release|Any CPU
52+
{C4BB6A39-28E6-454D-8679-92562CEAD0A9}.Release|x86.Build.0 = Release|Any CPU
53+
EndGlobalSection
54+
GlobalSection(SolutionProperties) = preSolution
55+
HideSolutionNode = FALSE
56+
EndGlobalSection
57+
GlobalSection(NestedProjects) = preSolution
58+
{9378C7BF-0899-4835-B8FB-099292C8C63D} = {B286BCBD-DAD8-4DE7-9334-3DE18DF233AF}
59+
{C4BB6A39-28E6-454D-8679-92562CEAD0A9} = {20DAA632-F8AD-4C5F-9E5F-FC82B7CB56A7}
60+
EndGlobalSection
61+
GlobalSection(ExtensibilityGlobals) = postSolution
62+
SolutionGuid = {A97C0A4B-E309-4485-BB76-898B37BFBFFF}
63+
EndGlobalSection
64+
EndGlobal

README.md

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
# BlazorLogging
2-
Microsoft Extension Logging implementation for Blazor
2+
Microsoft Extension Logging implementation for ASP.Net Blazor
3+
4+
> Note: This is a work in progress.

global.json

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"sdk": {
3+
"version": "2.1.300-preview2-008533"
4+
}
5+
}

src/BlazorLogging/BlazorLogger.cs

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
using Microsoft.AspNetCore.Blazor;
2+
using Microsoft.AspNetCore.Blazor.Browser.Interop;
3+
using Microsoft.Extensions.Logging;
4+
using System;
5+
6+
namespace BlazorLogging
7+
{
8+
internal class BlazorLogger : ILogger
9+
{
10+
private const string PREFIX = "BlazorLogging";
11+
12+
public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
13+
{
14+
switch (logLevel)
15+
{
16+
case LogLevel.Trace:
17+
RegisteredFunction.InvokeUnmarshalled<object>($"{PREFIX}.Trace", JsonUtil.Serialize(state));
18+
break;
19+
case LogLevel.Debug:
20+
RegisteredFunction.InvokeUnmarshalled<object>($"{PREFIX}.Debug", JsonUtil.Serialize(state));
21+
break;
22+
case LogLevel.Information:
23+
RegisteredFunction.InvokeUnmarshalled<object>($"{PREFIX}.Info", JsonUtil.Serialize(state));
24+
break;
25+
case LogLevel.Warning:
26+
RegisteredFunction.InvokeUnmarshalled<object>($"{PREFIX}.Warn", JsonUtil.Serialize(state));
27+
break;
28+
case LogLevel.Critical:
29+
case LogLevel.Error:
30+
RegisteredFunction.InvokeUnmarshalled<object>($"{PREFIX}.Error", JsonUtil.Serialize(state));
31+
if (exception != null) RegisteredFunction.InvokeUnmarshalled<object>($"{PREFIX}.Error", JsonUtil.Serialize(exception));
32+
break;
33+
default:
34+
break;
35+
}
36+
}
37+
38+
public bool IsEnabled(LogLevel logLevel) => true;
39+
40+
public IDisposable BeginScope<TState>(TState state) => null;
41+
}
42+
}
+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using Microsoft.Extensions.Logging;
2+
using System.Collections.Concurrent;
3+
4+
namespace BlazorLogging
5+
{
6+
internal class BlazorLoggerProvider : ILoggerProvider
7+
{
8+
private readonly ConcurrentDictionary<string, BlazorLogger> _loggers = new ConcurrentDictionary<string, BlazorLogger>();
9+
10+
public ILogger CreateLogger(string categoryName) => this._loggers.GetOrAdd(categoryName, this.CreateLoggerImplementation);
11+
12+
public void Dispose() => this._loggers.Clear();
13+
14+
private BlazorLogger CreateLoggerImplementation(string name) => new BlazorLogger();
15+
}
16+
}
+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<Project Sdk="Microsoft.NET.Sdk.Web">
2+
3+
<PropertyGroup>
4+
<TargetFramework>netstandard2.0</TargetFramework>
5+
<OutputType>library</OutputType>
6+
<IsPackable>true</IsPackable>
7+
<BlazorLinkOnBuild>false</BlazorLinkOnBuild>
8+
<LangVersion>latest</LangVersion>
9+
</PropertyGroup>
10+
11+
<ItemGroup>
12+
<!-- .js/.css files will be referenced via <script>/<link> tags; other content files will just be included in the app's 'dist' directory without any tags referencing them -->
13+
<EmbeddedResource Include="**\*.js" Exclude="bin\**\*.*;obj\**\*.*" LogicalName="blazor:js:%(RecursiveDir)%(Filename)%(Extension)" />
14+
<EmbeddedResource Include="**\*.css" Exclude="bin\**\*.*;obj\**\*.*" LogicalName="blazor:css:%(RecursiveDir)%(Filename)%(Extension)" />
15+
<!--<EmbeddedResource Include="content\**" Exclude="**\*.js;**\*.css" LogicalName="blazor:file:%(RecursiveDir)%(Filename)%(Extension)" />-->
16+
</ItemGroup>
17+
18+
<ItemGroup>
19+
<PackageReference Include="Microsoft.AspNetCore.Blazor.Browser" Version="0.3.0" />
20+
<PackageReference Include="Microsoft.AspNetCore.Blazor.Build" Version="0.3.0" />
21+
<PackageReference Include="Microsoft.Extensions.Logging" Version="2.0.1" />
22+
</ItemGroup>
23+
24+
</Project>
+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
using Microsoft.Extensions.DependencyInjection;
2+
using Microsoft.Extensions.DependencyInjection.Extensions;
3+
using Microsoft.Extensions.Logging;
4+
5+
namespace BlazorLogging
6+
{
7+
public static class HostingExtensions
8+
{
9+
/// <summary>
10+
/// Adds a logger that target the browser's console output
11+
/// </summary>
12+
public static ILoggingBuilder AddBlazorLogger(this ILoggingBuilder loggingBuilder)
13+
{
14+
loggingBuilder.Services.TryAddEnumerable(ServiceDescriptor.Singleton<ILoggerProvider, BlazorLoggerProvider>());
15+
return loggingBuilder;
16+
}
17+
}
18+
}

0 commit comments

Comments
 (0)