> For the complete documentation index, see [llms.txt](https://docs.scepman.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.scepman.com/pt/configuracao-do-azure/log-configuration.md).

# Gestão de registos

### Ativar o registo no Azure Monitor

A partir da versão 3.0, o SCEPman, bem como o Certificate Master, irá utilizar a API de Ingestão de Logs da Microsoft para escrever registos no Azure Monitor. Isto utiliza o conceito de um Log Analytics Workspace para armazenar os dados e permitir a análise, bem como uma Data Collection Rule que faz a interface entre o App Service e o armazenamento de registos. Isto permite uma abordagem mais moderna, incluindo permissões baseadas em RBAC para o SCEPman aceder ao LAW.

A criação do Log Analytics Workspace, bem como a configuração da Data Collection Rule, é feita automaticamente ao executar `Complete-SCEPmanInstallation` do módulo PowerShell do SCEPman.

{% hint style="info" %}
O **retenção predefinida** para dados armazenados numa Tabela do Log Analytics é **30 dias**. Caso seja necessário um período de retenção diferente, ajuste em conformidade a configuração da tabela "SCEPman\_CL".
{% endhint %}

#### Reativando a API de Coleta de Dados

Se, por qualquer motivo, quiser restabelecer a API anterior a ser utilizada, pode fazê-lo removendo as variáveis do App Service relacionadas com a Ingestão de Logs e adicionando novamente as que serão usadas pela API de Coleta de Dados.

Variáveis a serem **removidas**:

* [AppConfig:LoggingConfig:DataCollectionEndpointUri](/pt/configuracao-do-scepman/application-settings/dependencies-azure-services/logging.md#appconfig-loggingconfig-datacollectionendpointuri)
* [AppConfig:LoggingConfig:RuleId](/pt/configuracao-do-scepman/application-settings/dependencies-azure-services/logging.md#appconfig-loggingconfig-ruleid)

Variáveis a serem adicionadas:

* [AppConfig:LoggingConfig:WorkspaceId](/pt/configuracao-do-scepman/application-settings/dependencies-azure-services/logging.md#appconfig-loggingconfig-workspaceid)
* [AppConfig:LoggingConfig:SharedKey](/pt/configuracao-do-scepman/application-settings/dependencies-azure-services/logging.md#appconfig-loggingconfig-sharedkey)

O SCEPman irá aplicar automaticamente as definições após um reinício e voltará a utilizar a API de Coleta de Dados.

## Exemplos de consultas KQL

### Ver problemas com a sua instância SCEPman

```kusto
SCEPman_CL
| where Level == "Warn" or Level == "Error" or Level == "Fatal"
```

### Número de certificados emitidos por endpoint no período de tempo selecionado

{% hint style="success" %}
Esta consulta está garantidamente funcional com o SCEPman 3.0 e versões mais recentes quando se utiliza a API de Ingestão de Logs para registo. Alterações ao SCEPman que tornem esta consulta inutilizável serão consideradas alterações de rutura.
{% endhint %}

{% tabs %}
{% tab title="API de Ingestão de Logs ( Predefinida )" %}

```kql
SCEPman_CL
| where Level == "Info" and Message startswith_cs "Foi emitido um certificado com o número de série"
| project Message, RequestBase = trim_end('/', replace_string(replace_string(replace_regex(RequestUrl, "(/pkiclient\\.exe)?(\\?operation=PKIOperation(&message=.+)?)?", ""),"certsrv/mscep/mscep.dll","intune"),"step/enrollment","activedirectory"))
| summarize IssuanceCount = count() by Endpoint = extract("/([a-zA-Z]+)$", 1, RequestBase)
```

{% endtab %}

{% tab title="API de Coleta de Dados ( Antiga )" %}

```kusto
SCEPman_CL
| where Level == "Info" and Message startswith_cs "Foi emitido um certificado com o número de série"
| project Message, RequestBase = trim_end('/', replace_string(replace_string(replace_regex(RequestUrl_s, "(/pkiclient\\.exe)?(\\?operation=PKIOperation(&message=.+)?)?", ""),"certsrv/mscep/mscep.dll","intune"),"step/enrollment","activedirectory"))
| summarize IssuanceCount = count() by Endpoint = extract("/([a-zA-Z]+)$", 1, RequestBase)
```

{% endtab %}
{% endtabs %}

A partir do SCEPman 2.8, existe sempre exatamente uma entrada de registo de nível Info cujo texto começa com "Foi emitido um certificado com o número de série " por cada certificado emitido, seguida do respetivo número de série. No entanto, devido ao problema insolúvel [Problema dos Dois Exércitos](https://en.wikipedia.org/wiki/Two_Generals'_Problem), pode acontecer que o certificado criado nunca chegue ao requerente ou que algum outro tipo de erro impeça o registo efetivo. Da mesma forma, em caso de erros graves, pode acontecer que exista uma entrada de registo sem entrada correspondente na base de dados ou vice-versa.

### Certificados distintos com verificação OCSP

{% tabs %}
{% tab title="API de Ingestão de Logs ( Predefinida )" %}

```kusto
let map_certtype = datatable(serial_start:string, readable:string)
[
  "40", "Dispositivo Intune",
  "41", "Dispositivo Intune",
  "42", "Dispositivo Intune não compatível",
  "50", "Estático",
  "51", "Estático",
  "60", "Utilizador Intune",
  "61", "Utilizador Intune",
  "64", "Utilizador Jamf",
  "65", "Utilizador Jamf",
  "6C", "Utilizador Jamf no dispositivo",
  "6D", "Utilizador Jamf no dispositivo",
  "70", "Domain Controller",
  "7C", "Utilizador Jamf no computador",
  "7D", "Utilizador Jamf no computador",
  "54", "Computador Jamf",
  "55", "Computador Jamf",
  "44", "Dispositivo Jamf",
  "45", "Dispositivo Jamf"
];
SCEPman_CL
| where LogCategory == "Scepman.Server.Controllers.OcspController" and Level == "Info"
| where Message startswith_cs "Resposta OCSP"
| project serial = extract("Número de série ([A-F0-9]+)", 1, Message)
| distinct serial
| extend serial_start = substring(serial,0,2)
| join kind=leftouter map_certtype on serial_start
| summarize count() by (readable)
```

{% endtab %}

{% tab title="API de Coleta de Dados ( Antiga )" %}

```kql
let map_certtype = datatable(serial_start:string, readable:string)
[
  "40", "Dispositivo Intune",
  "41", "Dispositivo Intune",
  "42", "Dispositivo Intune não compatível",
  "50", "Estático",
  "51", "Estático",
  "60", "Utilizador Intune",
  "61", "Utilizador Intune",
  "64", "Utilizador Jamf",
  "65", "Utilizador Jamf",
  "6C", "Utilizador Jamf no dispositivo",
  "6D", "Utilizador Jamf no dispositivo",
  "70", "Domain Controller",
  "7C", "Utilizador Jamf no computador",
  "7D", "Utilizador Jamf no computador",
  "54", "Computador Jamf",
  "55", "Computador Jamf",
  "44", "Dispositivo Jamf",
  "45", "Dispositivo Jamf"
];
SCEPman_CL
| where LogCategory_s == "Scepman.Server.Controllers.OcspController" and Level == "Info"
| where Message startswith_cs "Resposta OCSP"
| project serial = extract("Número de série ([A-F0-9]+)", 1, Message)
| distinct serial
| extend serial_start = substring(serial,0,2)
| join kind=leftouter map_certtype on serial_start
| summarize count() by (readable)
```

{% endtab %}
{% endtabs %}


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.scepman.com/pt/configuracao-do-azure/log-configuration.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
