Como habilitar o log detalhado do Mosquitto broker no Windows 7?

8

Tenho uma pergunta anterior e, para me aproximar de uma solução, quero habilitar o log do broker do Mosquitto no Windows 7.

Originalmente, iniciei o broker manualmente da seguinte maneira:

mosquitto -p 1883 -v

-vsignifica log detalhado do console. Mas isso não fornece informações suficientes, apenas a seguinte linha no caso do meu problema:

1486293976: Socket error on client <unknown>, disconnecting.

Eu tentei fazer o que está descrito nesta resposta . Aqui está a parte de log do arquivo de configuração:

# Note that if the broker is running as a Windows service it will default to
# "log_dest none" and neither stdout nor stderr logging is available.
# Use "log_dest none" if you wish to disable logging.
log_dest stdout

# If using syslog logging (not on Windows), messages will be logged to the
# "daemon" facility by default. Use the log_facility option to choose which of
# local0 to local7 to log to instead. The option value should be an integer
# value, e.g. "log_facility 5" to use local5.
#log_facility

# Types of messages to log. Use multiple log_type lines for logging
# multiple types of messages.
# Possible types are: debug, error, warning, notice, information, 
# none, subscribe, unsubscribe, websockets, all.
# Note that debug type messages are for decoding the incoming/outgoing
# network packets. They are not logged in "topics".
log_type error
log_type warning
log_type notice
log_type information

# Change the websockets logging level. This is a global option, it is not
# possible to set per listener. This is an integer that is interpreted by
# libwebsockets as a bit mask for its lws_log_levels enum. See the
# libwebsockets documentation for more details. "log_type websockets" must also
# be enabled.
#websockets_log_level 0

# If set to true, client connection and disconnection messages will be included
# in the log.
connection_messages true

# If set to true, add a timestamp value to each log message.
log_timestamp true

Nesse caso, iniciei o broker da seguinte maneira:

mosquitto -p 1883

-vA opção substituiria o arquivo de configuração pela configuração padrão, por isso deixei de fora. Mas não vejo log no console.


Em vez de stdouteu tentar fazer logon em um arquivo, e alterei a configuração da seguinte maneira:

log_dest file d:\mosquitto.txt

Criei o arquivo manualmente e iniciei o broker da mesma maneira, mas sem sucesso.


Não recebo nenhuma mensagem de log se não usar a -vopção Como isso deve ser feito corretamente?

Bence Kaulics
fonte
Fornece log_type debugou log_type allfornece mais informações?
Aurora0001
1
@ Aurora0001 Não importa o que eu defina no arquivo de configuração, não recebo nenhuma saída de log. Somente a -vopção fornece algumas entradas de log no console (cmd), mas que usa a configuração padrão.
Bence Kaulics
@JimmyWestberg Embora sua resposta ofereça um mecanismo de registro conveniente, ele registra apenas informações relacionadas a tópicos enquanto eu estava interessado nos logs de erro / aviso do mosquiteiro broker, que eu cansei de configurar no arquivo de configuração do mosquiteiro.
Bence Kaulics

Respostas:

8

Isto é o que eu faço. Script a seguir salvo como timestampLog.vbs:

Dim str
Do While Not WScript.StdIn.AtEndOfStream
  str = WScript.StdIn.ReadLine
  WScript.StdErr.WriteLine "[" & now & "]" & str
Loop

Então eu executo isso na linha de comando:

C:\Program Files\mosquitto>mosquitto_sub -t +/# -v | cscript //nologo timestampLog.vbs 2> C:\*USER*\Desktop\logfile.txt

Onde você pode alterar o caminho para sua pasta mosquiteiro e altere o caminho "logfile.txt" para o que quiser.

Se é isso que você está procurando, não sei, mas outra pessoa pode gostar da solução fornecida aqui. Para quebrar a linha de comando:

C:\Program Files\mosquitto> é a pasta local do Mosquitto

mosquitto_sub é o arquivo .exe usado para ouvir o broker

-t +/#"-t" é dar o arquivo .exe a informação para ouvir t OPIC de + / # que é todos tópicos de clientes. "#" significaria todos os tópicos, mesmo os tópicos criados pelo broker. \ $ SYS / # ouvirá apenas os tópicos do intermediário. É possível ter múltiplos -t (eu acho).

-v é fornecer ao arquivo .exe as informações para exibir os tópicos detalhadamente, ou seja, também gerar o próprio tópico (não apenas seu valor).

| é canalizar esse primeiro comando no comando de script.

cscript //nologo timestampLog.vbsé executar o cscript.exe com o script vbs que escrevemos anteriormente. //nologoestá dizendo ao prompt da linha de comando para exibir as informações de saída do cscript.exe em um arquivo externo, em vez do próprio prompt.

2> está dizendo ao prompt da linha de comando para emitir "StdErr" (que foi o que pedimos ao script para canalizar todas as mensagens no arquivo .vbs).

C:\*USER*\Desktop\logfile.txté o caminho e o nome do arquivo da saída. Em vez de .txt, você pode considerar usar .log ou outra coisa.

Jimmy Westberg
fonte
4

A resposta desta pergunta: Como habilitar WebSockets no Mosquitto em execução no Windows? realmente respondeu a essa pergunta também.

Como se viu, o arquivo de configuração do Mosquitto deve ser adicionado explicitamente na linha de comando.

Ao executar o mosquitto na linha de comando, você precisa apontar explicitamente para o arquivo de configuração com a opção -c

mosquitto -v -c /path/to/mosquitto.conf

Depois disso, consegui obter informações adicionais sobre eventos de erro de soquete ou algo assim.

1489438223: versão do mosquito 1.4.10 (data de compilação 24/08/2016 21: 03: 24.73)

1489438223: Configuração carregada a partir de mosquitto.conf.

1489438223: Abrindo o soquete de escuta ipv6 na porta 1883.

1489438223: Erro: normalmente é permitida apenas uma utilização de cada endereço de soquete (protocolo / endereço de rede / porta).

1489438341: versão do mosquito 1.4.10 (data de criação 24/08/2016 21: 03: 24.73)

1489438341: Configuração carregada do mosquitto.conf.

1489438341: Abrindo o soquete de escuta ipv6 na porta 1883.

1489438341: Abrindo o soquete de escuta ipv4 na porta 1883.

1489438363: Nova conexão de 192.168.1.4 na porta 1883.

1489438363: Novo cliente conectado a partir de 192.168.1.4 como root.1489438369381 (c1, k60, u'phone ').

1489438363: Enviando CONNACK para root.1489438369381 (0, 0)

1489438363: SUBSCRIBE recebido do root.1489438369381

1489438363: ambiente / umidade (QoS 1)

1489438363: root.1489438369381 1 quarto / umidade

1489438363: enviando> SUBACK para o root.1489438369381

1489438453: O cliente root.1489438369381 excedeu o tempo limite, desconectando.

1489438453: Erro de soquete no cliente root.1489438369381, desconectando.

Bence Kaulics
fonte
3
  1. carga útil do log

    Se você deseja registrar a carga útil da mensagem PUBLISH, aqui eu adiciono o registro de custo no mosquitto v1.5.3 souce:

    Fonte no Git Hub .

    // mostra apenas a carga útil ASCII, os dados binários talvez quebraram o terminal.

  2. uso em mosquitto.conf:

    carga útil do log_type

  3. resultado

    log tornar-se:

    1542293777: Received PUBLISH from client_20454 (d0, q0, r0, m0, '$rpc/device1/client_20454/25MhY4xUwiMZIuytfb89Vjrh4QU=/req', ... (64 bytes))
    1542293777: > payload: '{"method":"ServerExposed.Ping","params":[{"Num":20454}],"id":0}'
    1542293777: Sending PUBLISH to device1 (d0, q0, r0, m0, '$rpc/device1/client_20454/25MhY4xUwiMZIuytfb89Vjrh4QU=/req', ... (64 bytes))
    
    1542293777: Received PUBLISH from device1 (d0, q0, r0, m0, '$rpc/device1/client_20454/25MhY4xUwiMZIuytfb89Vjrh4QU=/res', ... (57 bytes))
    1542293777: > payload: '{"id":0,"result":{"Done":true,"Num":20454},"error":null}'
    1542293777: Sending PUBLISH to client_20454 (d0, q0, r0, m0, '$rpc/device1/client_20454/25MhY4xUwiMZIuytfb89Vjrh4QU=/res', ... (57 bytes))
    
yurenchen
fonte
1
O que acontece quando você publica uma carga útil binária?
hardillb
oh, só foi testada com carga ascii, binário talvez quebrou o terminal, esqueci de dizer
yurenchen
2

Descobri isso há um tempo, mas não consigo atribuir ao autor original. Funciona muito bem para logs existentes, mas não pode 'tail -f' com esta solução:

sudo cat /var/log/mosquitto/mosquitto.log | grep -v datab|perl -pe 's/(\d+)/localtime($1)/e'

Usando isso no linux, mas deve funcionar no WSL / cygwin.

jshep321
fonte
2
Por que você não pode trocar o catpor tail -f? e se não, então o gato é redundante e você deve deixar o grep abrir o arquivo
hardillb