Gerenciamento de log
Lado do servidor (lado do servidor)
O ASP.NET Boilerplate usa a Ferramenta de Logging da Castle Windsor e pode usar diferentes bibliotecas de classe de log, como: log4net, nlog, Serilog ... e assim por diante. Para todas as bibliotecas de classe de log, o Castle fornece uma interface geral para implementá -lo.
Nota do tradutor: o que é o castelo: o castelo é um projeto de código aberto para a plataforma .NET, desde a estrutura de acesso a dados ORM a contêineres do IOC, até a estrutura do MVC e a AOP na camada da web, ela basicamente inclui tudo em todo o processo de desenvolvimento. O contêiner do IOC do ASP.NET Boilerplate é implementado através do Castle.
O Log4Net é o componente de log mais popular no ASP.NET. Arquivo.
Obtenha o Logger
Independentemente de qual componente da biblioteca de log você escolher, é o mesmo para fazer login através do código. (A queixa aqui, a interface iLogger universal do castelo é realmente incrível).
Vamos ao tópico: (Nota do tradutor: o código a seguir é o CASTLE.CORE.
1. Antes de tudo, precisamos lidar com o logger de registro primeiro.
Em seguida, vamos dar uma olhada em como o ASP.NET Boilerplate implementa a função de registro:
usando o castle.core.logging; Aqui, definimos primeiro um registrador de propriedades públicas do tipo ILogger, que é o objeto que usamos para gravar logs. Depois de criar o objeto TaskAppService (a tarefa definida em nosso aplicativo), ele é implementado por meio de injeção de atributos. public ILOGGER LOGGER {GET; Esta é a melhor maneira de implementar a injeção de dependência, // se você não definir esse logger vazio, uma exceção será gerada quando obtivermos a referência do objeto e a instanciarmos. // faz isso, garante que o objeto não esteja vazio. Portanto, em outras palavras, sem a configuração de um madeireiro, o log não será gravado e um objeto nulo será retornado. // O objeto NullLogger não é nada vazio. Somente ao fazer isso, podemos garantir que as classes que definamos o trabalho normalmente quando instanciadas. Logger = NullLogger.Instance; }} A cópia do código é a seguinte:Info 2014-07-13 13: 40: 23.360 [8] SimpleTaskSystem.Tasks.TaskAppService-Criando uma nova tarefa com descrição: Lembre-se de beber leite antes de dormir!
Depois de escrever no log, podemos visualizar o arquivo de log, assim como o seguinte formato:
Usando o Logger via classe baseA estrutura de caldeira ASP.NET fornece as classes base dos controladores MVC, controladores de API da Web e classes de serviço de aplicativos (o controlador e os serviços de aplicativos que você definirá deve herdar as classes base do ASP.NET Boilerplate. Em outras palavras, quando você o personaliza. Os controladores da API da Web, os controladores MVC e as classes de serviço de aplicativos herdam as classes base correspondentes à estrutura do ASP.NET Boilerplate, para que você possa usar diretamente o logger).
classe pública HomeController: SimpleTaskSystemControllerBase {public ActionResult Index () {Logger.debug (uma mensagem de log de amostra ...);Descrição: SimpleTaskSystemControllerBase Este controlador de classe base é o controlador de classe base que nos definimos e deve herdar do ABPController.
Dessa forma, o madeireiro pode funcionar normalmente. Obviamente, você também pode implementar sua própria classe base, para não usar mais a injeção de dependência.
Configuração
Se você gerar seu projeto através de modelos de caldeira ASP.NET no site oficial, todas as configurações do log4net serão geradas automaticamente.
O formato de configuração padrão é o seguinte:
• Nível de log: nível de registro de log, 5 depuração, informações, aviso, erro ou fatal.
• Data e hora: hora de registro.
• Número do thread: o número do thread quando cada linha de log é gravada.
• Nome do Logger: o nome do Logger, geralmente o nome da classe.
• Texto do log: o conteúdo do log que você escreveu.
Arquivo de configuração: log4net.config geralmente está localizado no diretório da web do projeto.
<? xml versão = 1.0 coding = utf-8?> <og4net> <nome do appender = rollingFilePpender type = log4net.appender.rollingFileAppender> <arquivo de arquivo = logs /logs.txt /> <AppendToFile Valor = true /> <rollingstyle Valor = Size /> <maxsizerollbackups value = 10 /> <maximumfilesize value = 10000kb /> <staticLogFileName value = true /> <layout type = log4net.layout.patternlayout> <conversionPattern Valor = %-5LEvel %Data [ %-5.5Thread] %-40.40Logger- %Mensagem %newline /> </sylayout> </pepnder> <somic> <appender-ref ref = rollingFileAppender /> <Valor de nível = Debug/> </root> <nome do logger = Nibernate> <Valor de nível = warn/> </logger> </log4net>
O Log4Net é um componente de biblioteca de log muito poderoso e fácil de usar. Você pode definir o nível mínimo de log, assim como a configuração acima para Nibernate. Diferentes madeireiros escrevem toras diferentes, etc.
Para uso específico, consulte: http://logging.apache.org/log4net/release/config-examples.html
Finalmente, no arquivo global.asax do projeto, defina o arquivo de configuração do log4net:
classe pública mvCapplication: abpwebApplication {substituição protegida void application_start (remetente do objeto, EventArgs e) {iocmanager.instance.ioccontainer.addfacility <oggingfacility> (f => f.UseLog4Net (). remetente, e);Algumas linhas de código Log4Net, o componente de log. Porque, nossa estrutura implementa o registrador por meio de injeção de dependência!
Lado do cliente (cliente)
Finalmente, o que é ainda mais incrível é que você também pode chamar o registrador no lado do cliente. No lado do cliente, a estrutura de caldeira ASP.NET possui uma API de log JavaScript correspondente, o que significa que você pode gravar os logs do navegador, e o código de implementação é o seguinte:
abp.log.warn ('uma mensagem de log de amostra ...');API: A API JavaScript do cliente, o que você precisa explicar aqui é que você pode usar o console.log para produzir logs no cliente, mas essa API não suporta necessariamente todos os navegadores e pode causar exceções ao seu script. APIs, a nossa é segura e você pode até sobrecarregar ou estender essas APIs.
abp.log.debug ('...'); abp.log.info ('...'); abp.log.warn ('...'); abp.log.error ('...' );Gerenciamento de configurações
introduzir
Cada aplicativo precisa armazenar algumas configurações e usá -las em algum lugar do aplicativo. A estrutura ABP fornece uma poderosa infraestrutura que podemos definir no servidor ou cliente para armazenar/obter configurações de aplicativo, inquilino e no nível do usuário.
As configurações geralmente são armazenadas em um banco de dados (ou em outra fonte), representado pela estrutura correspondente à sequência de nomes-valor. Podemos converter valores de não cordão em valores de string para armazenamento.
Nota: Sobre a interface ISettingStore
Para usar o Gerenciamento de Configurações, a interface ISettingStore deve ser implementada. Você pode implementá-lo à sua maneira, e há implementações completas no projeto de módulo-zero a se referir.
Definir configurações
Você deve definir as configurações antes de usá -las. A estrutura ABP é um design modular, portanto, módulos diferentes podem ter configurações diferentes. Para definir as próprias configurações do módulo, cada módulo deve criar uma classe derivada herdada do SettingProvider. O exemplo do provedor de configuração é o seguinte:
public class MySettingProvider: SettingProvider {Public Substitua iEnumerable <AffingDefinition> getSettingDefinitions (CetweetDefinitionProviderContext Context) {Return New [] {New SettingDefinition (SmtPerVeraddress, 127.0.0G formiga) , Nova Configuração de Definição ( SitecolorpReference, Red, Scopes: SettingScopes.User, ISVISBLETOCLIENTES: TRUE)};O método getSettingDefinitions retorna o objeto SettingDefinition. O construtor da classe SettingDefinition possui os seguintes parâmetros:
• Nome (necessário): deve ter um nome exclusivo em todo o sistema. Uma maneira melhor é definir constantes de string para definir o nome.
• Valor padrão: define um valor padrão. Este valor pode ser nulo ou uma string vazia.
• Escopos: define o escopo da configuração (veja abaixo).
• Nome da exibição: uma sequência localizável para exibir posteriormente o nome definido na interface do usuário.
• Descrição: uma sequência localizável para exibir posteriormente a descrição das configurações na interface do usuário.
• Grupo: pode ser usado para configurar grupos. Isso é apenas para uso da interface do usuário e não é para definir gerenciamento.
• ISVISIBLETOCLIENTS: A configuração para TRUE disponibilizará as configurações no cliente.
Depois de criar o SettingProvider, devemos registrar nosso módulo no método PreIntialize:
Configuration.Settings.Providers.add <MySettingProvider> (); Portanto, o provedor de configuração pode injetar quaisquer dependências (como um repositório) para gerar alguma outra fonte da definição de configuração.
Defina o intervalo
Existem três configurações (ou níveis) definidas na enumeração do SettingScopes:
• Aplicativo: as configurações em todo o aplicativo são usadas para configurações independentes do usuário/inquilino. Por exemplo, podemos definir uma configuração chamada SMTPSERVERADDRESS que obtém o endereço IP do servidor ao enviar um email. Se essa configuração tiver um único valor (não alterado com base no usuário), podemos defini -la como escopo do aplicativo.
• Inquilino: se o aplicativo for multi-inquilino, podemos definir configurações específicas do inquilino.
• Usuário: podemos usar configurações em todo o usuário para armazenar/obter valores definidos para cada usuário.
A enum do SettingScopes possui uma propriedade Flags, para que possamos definir uma configuração com vários escopos.
A faixa de configurações é hierárquica. Por exemplo, se definirmos o intervalo de configurações para o aplicativo |
• Obtemos o valor de um usuário específico se ele definir (reescrever) o usuário.
• Caso contrário, obtemos o valor específico do inquilino se ele definir (reescrever) o inquilino.
• Caso contrário, obtemos o valor do aplicativo se ele definir o aplicativo.
• Caso contrário, obtemos o valor padrão.
O valor padrão pode ser nulo ou uma string vazia. Se possível, é recomendável fornecer um valor padrão para as configurações.
Obtenha o valor definido
Depois de definir as configurações, podemos obter seu valor atual no servidor e no cliente.
(1) Lado do servidor
O ISETTINGMANAGER é usado para executar configurações. Podemos injetar e usá -lo em qualquer lugar do aplicativo. ISettingManager define muitos métodos para obter valores definidos.
O método mais usado é o getSettingValue (ou getSettingValuEasync é uma chamada assíncrona). Ele retorna o valor definido atualmente com base no intervalo de configurações padrão, aplicativo, inquilino e de usuário (conforme descrito no parágrafo antes da faixa de definição). exemplo:
// obtendo um valor booleano (chamada assíncrona) var value1 = aguarda de setembro
GetSettingValue possui versões genéricas e assíncronas, como mostrado acima. Também existem maneiras de obter uma lista de configurações para um inquilino ou usuário específico ou para todas as configurações.
Como o isettingManager é amplamente utilizado, algumas classes base específicas (como Applicationservice, Domainservice e ABPController) têm uma propriedade chamada SettingManager. Se herdarmos dessas classes, não há necessidade de injetar explicitamente.
(2) cliente
Se o ISVISBLETOCLIENTS estiver definido como true ao definir as configurações, você poderá obter seu valor atual usando JavaScript no cliente. ABP.Setting O espaço para nome define as funções e objetos necessários. Exemplo:
Var CurrentColor = ABP.Setting.get (SitecolorpReference); Você pode usar o objeto abp.setting.Values para obter todos os valores. Observe que, se você alterar as configurações do lado do servidor, o cliente não saberá sobre essa alteração, a menos que a página seja atualizada ou recarregada de alguma forma ou atualizada manualmente via código.
Alterar configurações
O ISETTINGMANAGER define o alteração do Métodos de ApplicationAsync, Mudança de Campações e Montões de Mudança (e a versão síncrona) para alterar as configurações do aplicativo, inquilino e usuário separadamente.
Sobre cache
O cache está no gerenciamento de configurações do lado do servidor; portanto, não devemos usar diretamente a instrução Repositório ou Atualização do banco de dados para alterar o valor definido.