рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рд▓реЙрдЧрд┐рдВрдЧ рд╕реНрддрд░

ThoughtWorks Technology Radar рдХреЛ рдкрдврд╝рддреЗ рд╣реБрдП, рдореИрдВрдиреЗ " рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рд▓реЙрдЧрд┐рдВрдЧ рдкреНрд░рддрд┐ рдЕрдиреБрд░реЛрдз " рддрдХрдиреАрдХ рдкрд░ рдареЛрдХрд░ рдЦрд╛рдИред рд╣рдо рдХрдиреНрдлрд░реНрдорд┐рдЯ рдореЗрдВ рд▓реЙрдЧрд┐рдВрдЧ рдХрд╛ рд╡реНрдпрд╛рдкрдХ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╡рд░реНрдгрди


рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рджрд╛рдВрд╡ рдкрд░ рд╣реИред рдорд╛рди рд▓реАрдЬрд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╡реЗрдм рд╕реЗрд╡рд╛ рд╣реИред рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░, рдпрд╣ рдЙрддреНрдкрд╛рджрди рд╕рд░реНрд╡рд░ рдкрд░ рдХреНрд░реИрд╢ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдХреБрдЫ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреНрд░реИрд╢ рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рд╣реЛрддреЗ рд╣реИрдВред рдпрд╛ рдХреЗрд╡рд▓ рдПрдХ рдЕрд▓рдЧ рдкрд╣реБрдВрдЪ рдмрд┐рдВрджреБ рдкрд░ ... рд╣рдореЗрдВ рдПрдХ рдХрд╛рд░рдг рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд▓реЙрдЧрд┐рдВрдЧ рд╣рдорд╛рд░реА рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЖрддрд╛ рд╣реИред

рд╣рдо рд╕рдорд╕реНрдпрд╛ рдХреЗ рдХрд╛рд░рдг рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рд▓реЙрдЧрд┐рдВрдЧ рдирд┐рд░реНрджреЗрд╢ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред рдпреЗ рдирд┐рд░реНрджреЗрд╢ рдЖрдорддреМрд░ рдкрд░ рдЖрдкрдХреЗ рд╕рдВрджреЗрд╢ рдХреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд▓реЙрдЧ рд╕реНрддрд░ (рдбреАрдмрдЧ, рд╕реВрдЪрдирд╛, рдЪреЗрддрд╛рд╡рдиреА, ...) рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд▓реЙрдЧ рдХрд╛ рдЕрдкрдирд╛ рд╕реНрддрд░ рднреА рд╣реЛрддрд╛ рд╣реИред рд▓реЙрдЧ рд╕реНрддрд░ рд╕реЗ рдКрдкрд░ рдХреЗ рд╕реНрддрд░ рд╡рд╛рд▓реЗ рд╕рднреА рд╕рдВрджреЗрд╢ рд▓реЙрдЧ рд╕реНрдЯреЛрд░реЗрдЬ (рдлрд╝рд╛рдЗрд▓, рдбреЗрдЯрд╛рдмреЗрд╕, ...) рдореЗрдВ рджрд░реНрдЬ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред рдпрджрд┐ рд╕рдВрджреЗрд╢ рд╕реНрддрд░ рд▓реЙрдЧ рд╕реНрддрд░ рд╕реЗ рдХрдо рд╣реИ, рддреЛ рд╕рдВрджреЗрд╢ рдмрд╕ рддреНрдпрд╛рдЧ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЬрдм рд╣рдорд╛рд░рд╛ рдЖрд╡реЗрджрди рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╣рдо рд╕рдВрднрд╡рддрдпрд╛ рдХреБрдЫ рд▓реЙрдЧ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреЛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЗрд╕рдХрд╛ рдЖрдХрд╛рд░ рдЫреЛрдЯрд╛ рд░рд╣реЗред рдЙрд╕реА рд╕рдордп, рдпрджрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд▓реЙрдЧ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдВ рд╣реЛрдВ рддрд╛рдХрд┐ рд╣рдо рд╕рдорд╕реНрдпрд╛ рдХреЗ рдХрд╛рд░рдг рдХреЛ рд╕рдордЭ рд╕рдХреЗрдВред рдпрд╣рд╛рдВ рдХрдард┐рдирд╛рдИ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдЖрдорддреМрд░ рдкрд░ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдореЗрдВ рд╕рднреА рд▓реЙрдЧрд░реНрд╕ рдХреЗ рд▓рд┐рдП рд▓реЙрдЧрд┐рдВрдЧ рдХрд╛ рдПрдХ рд╕реНрддрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рд╕рдм рдХреБрдЫ рдХреНрд░рдо рдореЗрдВ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕ рд╕реНрддрд░ рдХреЛ рдКрдВрдЪрд╛ рд░рдЦрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЪреЗрддрд╛рд╡рдиреА)ред рдпрджрд┐ рд╣рдореЗрдВ рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рдХрд╛рд░рдг рдХреА рддрд▓рд╛рд╢ рдХрд░рдиреА рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рдиреАрдЪреЗ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбреАрдмрдЧ) рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рдкреНрд░рддрд┐ рдЖрд╡реЗрджрди рд▓реЙрдЧрд┐рдВрдЧ рдХрд╛ рдПрдХ рд╕реНрддрд░


рдЬрдм рд╣рдо рд▓реЙрдЧрд┐рдВрдЧ рд╕реНрддрд░ рдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдХрдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдорд╛рд░реЗ рд▓реЙрдЧ рд╕реНрдЯреЛрд░ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рд╕реЗ рднрд░ рдЬрд╛рддреЗ рд╣реИрдВред рдпреЗ рд╕рдВрджреЗрд╢ рд╡рд┐рднрд┐рдиреНрди рдЕрдиреБрд░реЛрдзреЛрдВ рд╕реЗ рдЖрддреЗ рд╣реИрдВ рдФрд░ рдЖрдкрд╕ рдореЗрдВ рдорд┐рд╢реНрд░рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рд╕реЗрд╡рд╛ рджреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдЗрд╕рд╕реЗ рдХрдИ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВ:

  • рдЕрдиреНрдп рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕рдВрджреЗрд╢реЛрдВ рд╕реЗ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдХреИрд╕реЗ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рдП?
  • рдЕрдиреБрд░реЛрдз рдЬреЛ рдХреНрд░реИрд╢ рдХрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рдмрдирддреЗ рд╣реИрдВ, рд╡реЗ рдЕрдкрдирд╛ рд╕рдордп рд▓реЙрдЧ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдмрд┐рддрд╛рддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрди рд╕рдВрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
  • рд╕рдлрд▓ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕рдВрджреЗрд╢ рд▓реЙрдЧ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдЬрдЧрд╣ рд▓реЗ рд▓реЗрдВрдЧреЗ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрди рд╕рдВрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рдпреЗ рдХрдард┐рдирд╛рдЗрдпрд╛рдБ рджреБрд░реНрдЧрдо рдирд╣реАрдВ рд╣реИрдВред "рдмреБрд░реЗ" рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕рдВрджреЗрд╢реЛрдВ рд╕реЗ "рдЕрдЪреНрдЫреЗ" рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рд╕рд╣рд╕рдВрдмрдВрдз рдЖрдИрдбреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рднреА рдЖрдзреБрдирд┐рдХ рд▓реЙрдЧ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдЗрд╕ рд╕рд╣рд┐рдд рд╡рд┐рднрд┐рдиреНрди рдорд╛рдирджрдВрдбреЛрдВ рджреНрд╡рд╛рд░рд╛ рд░рд┐рдХреЙрд░реНрдб рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред

рдкреНрд░рджрд░реНрд╢рди рднреА рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдкреНрд░рдореБрдЦ рдореБрджреНрджрд╛ рдирд╣реАрдВ рд╣реИред рд▓реЙрдЧрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рд▓реЙрдЧрд┐рдВрдЧ рдХрд╛ рдкреНрд░рднрд╛рд╡ рдЖрдо рддреМрд░ рдкрд░ рд╡рд┐рдШрдЯрдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

рдФрд░ рдбрд┐рд╕реНрдХ рд╕реНрдерд╛рди рдЕрдм рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд╕реНрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рд░рд┐рдХреЙрд░реНрдб рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рдЦрд╛рд╕рдХрд░ рдпрджрд┐ рд╣рдо рд╕рдордп-рд╕рдордп рдкрд░ рдкреБрд░рд╛рдиреЗ рд░рд┐рдХреЙрд░реНрдбреНрд╕ рдХреЛ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдХреНрдпрд╛ рд╣рдо рдЗрд╕ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдХреНрдпрд╛ рд╣рдо рдХреБрдЫ рд╢рд░реНрддреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд▓реЙрдЧрд┐рдВрдЧ рд╕реНрддрд░ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдореИрдВ рдпрд╣рд╛рдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред

рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рд▓реЙрдЧрд┐рдВрдЧ рд╕реНрддрд░


рдореБрдЭреЗ рдЙрд╕ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рдмрддрд╛рдПрдВ рдЬреЛ рдореИрдВ рд▓рд╛рдЧреВ рдХрд░реВрдВрдЧрд╛ред рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд▓реЙрдЧрд┐рдВрдЧ рд╕реНрддрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╕реНрддрд░ рдХреА рдкрд╕рдВрдж рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╢рд░реНрддреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рдЪреАрд▓рд╛ рддрд░реАрдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдФрд░ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рдЗрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рдмрджрд▓рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЗрд╕рд▓рд┐рдП, рдХрд╛рд░реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реИред рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

рдореИрдВ .NET рдХреЛрд░ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡реЗрдм рд╕реЗрд╡рд╛ рдмрдирд╛рдКрдВрдЧрд╛ред рдЙрд╕рдХреЗ рдкрд╛рд╕ рдПрдХ рдПрдХрд▓ рдирд┐рдпрдВрддреНрд░рдХ рд╣реЛрдЧрд╛:

[Route("api/[controller]")] [ApiController] public class ValuesController : ControllerBase { ... // GET api/values [HttpGet] public ActionResult<IEnumerable<string>> Get() { Logger.Info("Executing Get all"); return new[] { "value1", "value2" }; } // GET api/values/5 [HttpGet("{id}")] public ActionResult<string> Get(int id) { Logger.Info($"Executing Get {id}"); return "value"; } } 

рд╣рдо рдмрд╛рдж рдореЗрдВ рд▓рдХрдбрд╝рд╣рд╛рд░реЗ рдХреА рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдореИрдВ рд▓реЙрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП log4net рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдЕрд╡рд╕рд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдореИрдВ рд▓реЗрд╡рд▓ рдЗрдирд╣реЗрд░рд┐рдЯреЗрдВрд╕ рдХреА рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ ред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдпрджрд┐ рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ X рдирд╛рдо рдХреЗ рд╕рд╛рде рд▓реЙрдЧ рдореЗрдВ Info рд▓реЙрдЧрд┐рдВрдЧ рд╕реНрддрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ X рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рд╕рднреА рд▓реЙрдЧ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, XY , XZ , XAB ) рдЗрд╕ рд╕рдорд╛рди рд╕реНрддрд░ рдХрд╛ рд╡рд╛рд░рд┐рд╕ рдХрд░реЗрдВрдЧреЗред

рдпрд╣рд╛рдВ рд╕реЗ рдореВрд▓ рд╡рд┐рдЪрд╛рд░ рдЖрддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП, рдореИрдВ рдХрд┐рд╕реА рддрд░рд╣ рд▓реЙрдЧрд┐рдВрдЧ рдХреЗ рдЖрд╡рд╢реНрдпрдХ рд╕реНрддрд░ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░реВрдВрдЧрд╛ред рдлрд┐рд░ рдореИрдВ log4net рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдПрдХ рдирдпрд╛ рдирд╛рдо рд▓реЙрдЧ рдмрдирд╛рдКрдВрдЧрд╛ ред рдЗрд╕ рд▓реЙрдЧ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд▓реЙрдЧрд┐рдВрдЧ рд╕реНрддрд░ рд╣реЛрдЧрд╛ред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╡рд░реНрддрдорд╛рди рдЕрдиреБрд░реЛрдз рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдИ рдЧрдИ рд╕рднреА рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рдЗрд╕ рдирдП рд▓реЙрдЧ рдХреЗ рдирд╛рдо рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдирд╛рдо рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рдпрд╣рд╛рдБ рдПрдХрдорд╛рддреНрд░ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ log4net рд▓реЙрдЧ рдХреЛ рдХрднреА рдирд╣реАрдВ рд╣рдЯрд╛рддрд╛ рд╣реИред рдПрдХ рдмрд╛рд░ рдмрдирд╛рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд╡реЗ рдЬреАрд╡рди рднрд░ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ, рдореИрдВ рд╢реБрд░реВ рдореЗрдВ рд▓реЙрдЧрд┐рдВрдЧ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрднрд╛рд╡рд┐рдд рд╕реНрддрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓реЙрдЧ рдмрдирд╛рддрд╛ рд╣реВрдВ:

 <?xml version="1.0" encoding="utf-8" ?> <log4net> <appender name="Console" type="log4net.Appender.ConsoleAppender"> <layout type="log4net.Layout.PatternLayout"> <!-- Pattern to output the caller's file name and line number --> <conversionPattern value="%5level [%thread] (%file:%line) - %message%newline" /> </layout> </appender> <appender name="RollingFile" type="log4net.Appender.RollingFileAppender"> <file value="RequestLoggingLog.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="WARN" /> <appender-ref ref="Console" /> <appender-ref ref="RollingFile" /> </root> <logger name="EdlinSoftware.Log.Error"> <level value="ERROR" /> </logger> <logger name="EdlinSoftware.Log.Warning"> <level value="WARN" /> </logger> <logger name="EdlinSoftware.Log.Info"> <level value="INFO" /> </logger> <logger name="EdlinSoftware.Log.Debug"> <level value="DEBUG" /> </logger> </log4net> 

рдЕрдм рдореЗрд░реЗ рдкрд╛рд╕ EdlinSoftware.Log.XXXX рдирд╛рдо рдХреЗ рд╕рд╛рде рдХрдИ рд▓реЙрдЧ рд╣реИрдВред рдпреЗ рдирд╛рдо рдкреНрд░рд╢реНрдиреЛрдВ рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд рд▓реЙрдЧ рдирд╛рдореЛрдВ рдХреЗ рдЙрдкрд╕рд░реНрдЧреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдмреАрдЪ рдЯрдХрд░рд╛рд╡ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЗрд╕ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдПрдХ AsyncLocal рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдкрд░рд┐рдХрд▓рд┐рдд рдЙрдкрд╕рд░реНрдЧ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реВрдВрдЧрд╛ ред рдЗрд╕ рд╡рд╕реНрддреБ рдХрд╛ рдореВрд▓реНрдп рдирдП OWIN рдорд┐рдбрд▓рд╡реЗрдпрд░ рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:

 app.Use(async (context, next) => { try { LogSupport.LogNamePrefix.Value = await LogSupport.GetLogNamePrefix(context); await next(); } finally { LogSupport.LogNamePrefix.Value = null; } }); 

рдЬрдм рдпрд╣ рдорд╛рди рд╕реЗрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╡рд╛рдВрдЫрд┐рдд рдирд╛рдо рдЙрдкрд╕рд░реНрдЧ рдХреЗ рд╕рд╛рде рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рдмрдирд╛рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ:

 public static class LogSupport { public static readonly AsyncLocal<string> LogNamePrefix = new AsyncLocal<string>(); public static ILog GetLogger(string name) { return GetLoggerWithPrefixedName(name); } public static ILog GetLogger(Type type) { return GetLoggerWithPrefixedName(type.FullName); } private static ILog GetLoggerWithPrefixedName(string name) { if (!string.IsNullOrWhiteSpace(LogNamePrefix.Value)) { name = $"{LogNamePrefix.Value}.{name}"; } return LogManager.GetLogger(typeof(LogSupport).Assembly, name); } .... } 

рдЕрдм рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рдЙрджрд╛рд╣рд░рдг рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ:

 [Route("api/[controller]")] [ApiController] public class ValuesController : ControllerBase { private ILog _logger; private ILog Logger { get => _logger ?? (_logger = LogSupport.GetLogger(typeof(ValuesController))); } .... } 

рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ: рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЙрди рдирд┐рдпрдореЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ рдЬрд┐рдирдХреЗ рджреНрд╡рд╛рд░рд╛ рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рд▓реЙрдЧрд┐рдВрдЧ рдХрд╛ рд╕реНрддрд░ рдЪреБрдирддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рдХрд╛рдлреА рд▓рдЪреАрд▓рд╛ рддрдВрддреНрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореВрд▓ рд╡рд┐рдЪрд╛рд░ C # рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рдореИрдВ рдПрдХ LogLevelRules.json рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдКрдВрдЧрд╛ , рдЬрд╣рд╛рдВ рдореИрдВ "рдирд┐рдпрдо - рд▓реЙрдЧрд┐рдВрдЧ рд╕реНрддрд░" рдЬреЛрдбрд╝реЗ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реВрдВрдЧрд╛:

 [ { "logLevel": "Debug", "ruleCode": "context.Request.Path.Value == \"/api/values/1\"" }, { "logLevel": "Debug", "ruleCode": "context.Request.Path.Value == \"/api/values/3\"" } ] 

рдпрд╣рд╛рдВ рд▓реЙрдЧрд▓реЗрд╡ рд▓реЙрдЧрд┐рдВрдЧ рдХрд╛ рд╡рд╛рдВрдЫрд┐рдд рд╕реНрддрд░ рд╣реИ, рдФрд░ рдирд┐рдпрдо рдХреЛрдб рд╕реА # рдХреЛрдб рд╣реИ рдЬреЛ рджрд┐рдП рдЧрдП рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдмреВрд▓рд┐рдпрди рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдПрдХ-рдПрдХ рдХрд░рдХреЗ рдирд┐рдпрдо рдХреЛрдб рдЪрд▓рд╛рдПрдЧрд╛ред рдкрд╣рд▓рд╛ рдирд┐рдпрдо, рдЬрд┐рд╕рдХрд╛ рдХреЛрдб рд╕рд╣реА рд╣реИ, рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓реЙрдЧрд┐рдВрдЧ рдХреЗ рдЙрдЪрд┐рдд рд╕реНрддрд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐ рд╕рднреА рдирд┐рдпрдо рдЭреВрдареЗ рд╣реИрдВ, рддреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реНрддрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдирд┐рдпрдореЛрдВ рдХрд╛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╕реЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, CSharpScript рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ :

 public class Globals { public HttpContext context; } internal class LogLevelRulesCompiler { public IReadOnlyList<LogLevelRule> Compile(IReadOnlyList<LogLevelRuleDescription> levelRuleDescriptions) { var result = new List<LogLevelRule>(); foreach (var levelRuleDescription in levelRuleDescriptions ?? new LogLevelRuleDescription[0]) { var script = CSharpScript.Create<bool>(levelRuleDescription.RuleCode, globalsType: typeof(Globals)); ScriptRunner<bool> runner = script.CreateDelegate(); result.Add(new LogLevelRule(levelRuleDescription.LogLevel, runner)); } return result; } } internal sealed class LogLevelRule { public string LogLevel { get; } public ScriptRunner<bool> Rule { get; } public LogLevelRule(string logLevel, ScriptRunner<bool> rule) { LogLevel = logLevel ?? throw new ArgumentNullException(nameof(logLevel)); Rule = rule ?? throw new ArgumentNullException(nameof(rule)); } } 

рдпрд╣рд╛рдБ, рд╕рдВрдХрд▓рди рд╡рд┐рдзрд┐ LogLevelRules.json рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдкрдврд╝реА рдЧрдИ рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕реВрдЪреА рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреА рд╣реИред рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдирд┐рдпрдо рдХреЗ рд▓рд┐рдП рдПрдХ рдзрд╛рд╡рдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдмрдирд╛рддрд╛ рд╣реИред

рдЗрд╕ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╕реВрдЪреА рдХреЛ рдмрдЪрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 LogSupport.LogLevelSetters = new LogLevelRulesCompiler().Compile( new LogLevelRulesFileReader().ReadFile("LogLevelRules.json") ); 

рдФрд░ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛:

 public static class LogSupport { internal static IReadOnlyList<LogLevelRule> LogLevelSetters = new LogLevelRule[0]; ... public static async Task<string> GetLogNamePrefix(HttpContext context) { var globals = new Globals { context = context }; string result = null; foreach (var logLevelSetter in LogLevelSetters) { if (await logLevelSetter.Rule(globals)) { result = $"EdlinSoftware.Log.{logLevelSetter.LogLevel}"; break; } } return result; } } 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЬрдм рдЖрд╡реЗрджрди рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рд╣рдо LogLevelRules.json рдХреЛ рдкрдврд╝рддреЗ рд╣реИрдВ, рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ CSharpScript рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╕реВрдЪреА рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕ рд╕реВрдЪреА рдХреЛ LogSupport.LogLevelSetters рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВред рдлрд┐рд░, рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП, рд╣рдо рд▓реЙрдЧрд┐рдВрдЧ рд╕реНрддрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╕реВрдЪреА рд╕реЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЪрд▓рд╛рддреЗ рд╣реИрдВред

рдХреЗрд╡рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдЪрд╛ рд╣реИ LogLevelRules.json рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдЯреНрд░реИрдХ рдХрд░рдирд╛ рд╣реИред рдпрджрд┐ рд╣рдо рдХреБрдЫ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд▓реЙрдЧрд┐рдВрдЧ рд╕реНрддрд░ рд╕реЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ рдирдпрд╛ рдирд┐рдпрдо рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд┐рдП рдмрд┐рдирд╛ рдЗрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдлрд╝рд╛рдЗрд▓ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ:

 var watcher = new FileSystemWatcher { Path = Directory.GetCurrentDirectory(), Filter = "*.json", NotifyFilter = NotifyFilters.LastWrite }; watcher.Changed += (sender, eventArgs) => { // ,  ,  ,   . Thread.Sleep(1000); LogSupport.LogLevelSetters = new LogLevelRulesCompiler().Compile( new LogLevelRulesFileReader().ReadFile("LogLevelRules.json") ); }; watcher.EnableRaisingEvents = true; 

рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВ LogSupport.LogLevelSetters рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рд╕реНрдЯреНрд░реАрдо рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛрдб рдХреЛ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдРрд╕реЗ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдкреВрд░реНрдг рдЖрд╡реЗрджрди рдХреЛрдб GitHub рдкрд░ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

рдХрдорд┐рдпреЛрдВ


рдКрдкрд░ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рдХреЛрдб рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд▓реЙрдЧрд┐рдВрдЧ рд╕реНрддрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЙрд╕рдХреЗ рдкрд╛рд╕ рдХрдорд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИред рдЖрдЗрдП рдЙрдирдХреА рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВред

1. рдпрд╣ рдЕрдкреНрд░реЛрдЪ рд▓реЙрдЧреНрд╕ рдХреЗ рдирд╛рдо рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, " MyClassLogger " рдХреЗ рдмрдЬрд╛рдп, " Edlinsoft.Log.Debug.MyClassLogger " рдЬреИрд╕реА рдЪреАрдЬрд╝ рдХреЛ рд▓реЙрдЧ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЖрдк рдЗрд╕рдХреЗ рд╕рд╛рде рд░рд╣ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИред рд╢рд╛рдпрдж рд▓реЙрдЧ (рд▓реЙрдЧ рд▓реЗрдЖрдЙрдЯ) рдХреЗ рд▓реЗрдЖрдЙрдЯ рдХреЛ рдмрджрд▓рдХрд░ рд╕рдорд╕реНрдпрд╛ рдХреЛ рджреВрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

2. рдЕрдм рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рд╡рд░реНрдЧреЛрдВ рдХреЗ рд╕реНрдерд┐рд░ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдпрд╣рд╛рдВ рд╕рдмрд╕реЗ рдЧрдВрднреАрд░ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рд╣рдореЗрд╢рд╛ рдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреЛрдИ рдЧрд▓рддреА рд╕реЗ рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдерд┐рд░ рдХреНрд╖реЗрддреНрд░ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЕрдЬреАрдм рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЖрдк рд╕реАрдзреЗ log4net рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд▓реЙрдЧрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд░рдг рд╡рд░реНрдЧ рдмрдирд╛рдХрд░ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рджреВрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЖрд╡рд░рдг рд╣рдореЗрд╢рд╛ рдкреНрд░рддреНрдпреЗрдХ рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП log4net рд▓реЙрдЧрд░ рдХреЗ рдирдП рдЙрджрд╛рд╣рд░рдг рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕реЗ рд╕реНрдерд┐рд░ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

3. рд╡рд░реНрдгрд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рд▓реЙрдЧрд░ рдХреЗ рдХрдИ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рджреМрд░рд╛рди рдФрд░ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдг рдХреЗ рджреМрд░рд╛рди рдореЗрдореЛрд░реА рдФрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕рд╛рдЗрдХрд┐рд▓ рджреЛрдиреЛрдВ рдХреА рдЦрдкрдд рд╣реЛрддреА рд╣реИред рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдпрд╣ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдореБрджреНрджрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

4. рдЬрдм рд╣рдо JSON рдлрд╝рд╛рдЗрд▓ рдХреЛ рдирд┐рдпрдореЛрдВ рдХреЗ рд╕рд╛рде рдмрджрд▓рддреЗ рд╣реИрдВ, рддреЛ рдирд┐рдпрдо рдХреЛрдб рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдБ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдЯреНрд░рд╛рдЗ-рдХреИрдЪ рдмреНрд▓реЙрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ рддрд╛рдХрд┐ рдпреЗ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣рдорд╛рд░реЗ рдореБрдЦреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдирд╖реНрдЯ рди рдХрд░реЗрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдореЗрдВ рдХрд┐рд╕реА рддрд░рд╣ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рдХреБрдЫ рдЧрд▓рдд рд╣реБрдЖред рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рджреЛ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:

  • рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдирд┐рдпрдо рдХреЛрдб рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рди рд╕рдордп рддреНрд░реБрдЯрд┐рдпреЛрдВред
  • рдЗрди рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рдХреА рд░рдирдЯрд╛рдЗрдо рддреНрд░реБрдЯрд┐рдпрд╛рдБред

рдХрд┐рд╕реА рддрд░рд╣ рд╣рдореЗрдВ рдЗрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рд╣рдорд╛рд░реА рд▓реЙрдЧрд┐рдВрдЧ рдХреЗрд╡рд▓ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧреА, рдФрд░ рд╣рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рднреА рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

5. JSON рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рдпрдо рдХреЛрдб, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдХреЛрдИ рднреА рдирд┐рд░реНрджреЗрд╢ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рд╕реБрд░рдХреНрд╖рд╛ рдореБрджреНрджреЛрдВ рдХреЛ рдЬрдиреНрдо рджреЗ рд╕рдХрддрд╛ рд╣реИред рдХрд┐рд╕реА рддрд░рд╣ рдЗрд╕ рдХреЛрдб рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рджреВрд╕рд░реА рдУрд░, рдпрджрд┐ рдХреЛрдИ рд╣рдорд▓рд╛рд╡рд░ рд╕реАрдзреЗ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ, рддреЛ рд╕реБрд░рдХреНрд╖рд╛ рд╕рдорд╕реНрдпрд╛ рд╕реНрдкрд╖реНрдЯ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖


рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореБрдЭреЗ рдпрд╣ рдзрд╛рд░рдгрд╛ рдирд╣реАрдВ рдорд┐рд▓реА рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЛ рд▓реЙрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдореМрдЬреВрджрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЙрдЧ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╡рд╛рд▓рд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрдкрдХрд░рдг рдкреВрд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рд▓реЙрдЧрд┐рдВрдЧ рдХреЗ рдПрдХрд▓ рд╕реНрддрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рднреА рдпрд╣рд╛рдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдлрд┐рд░ рднреА, рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЖрдкрдХреЛ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рднреЛрдЬрди рджреЗрдЧрд╛ред

Source: https://habr.com/ru/post/hi436340/


All Articles