Eu tenho alguns arquivos de log, crescendo uma linha de cada vez, como os arquivos de log. Os arquivos estão disponíveis via compartilhamento de rede SMB.
Eu quero copiar periodicamente esses arquivos. Como a rede é bastante lenta e congestionada, não quero transferir todos os arquivos de cada vez, mas apenas as novas linhas, que foram adicionadas após a cópia anterior.
Posso confiar nos programas que geram os logs para apenas anexar ao final do arquivo. (E se partes dos arquivos de log fossem modificadas de alguma forma após a gravação, todo o log seria não confiável e inútil de qualquer maneira). Não é necessário comparar o início dos arquivos de origem e destino.
Os arquivos de origem e a pasta de destino estão disponíveis apenas via compartilhamento de arquivos SMB, nenhum outro canal de comunicação entre os dois sistemas é permitido.
O computador que executa a tarefa de cópia pode acessar tanto o compartilhamento de arquivo de origem quanto o compartilhamento de arquivo de destino, mas ambos os compartilhamentos estão em redes diferentes e este computador é a única ponte entre eles.
Existe uma combinação inteligente de robocopy, xcopy ou outros comandos do Windows para fazer isso? Robocopy pode retomar downloads parciais, mas não consegui fazê-lo funcionar neste caso.
Eu li que um servidor RSync seria útil aqui, mas a comunicação deve atravessar vários firewalls corporativos bloqueando tudo, exceto o compartilhamento de arquivos smb, e o dispositivo que gera os logs não deve ser modificado, então não acho que seja uma opção.
O Windows 10 e o Windows Server 2019 vêm com:
A
-C
opção retoma a transferência em uma posição de byte especificada . Observe que ele não pula dados indesejados – ele busca a posição inicial desejada, para que os dados anteriores nunca sejam lidos. Para HTTP, isso significa usar uma solicitação de intervalo; para acesso direto ao sistema de arquivos significa literalmente uma operação seek().Quaisquer outras ferramentas que implementem operações diretas de arquivo também funcionariam, por exemplo, PowerShell usando
[System.IO.File]::Open()
, ou Python se você puder instalá-lo na máquina do meio (isso é apenas para fins de demonstração):É possível comparar logs antigos e novos e copiar apenas as novas linhas, mas isso seria meio autodestrutivo.
A operação de comparação em si precisará ler o arquivo de rede, o que é totalmente equivalente a copiá-lo. Você não ganhará nenhum desempenho.
Talvez você possa parametrizar o computador remoto para iniciar frequentemente um novo arquivo de log, ou copiar o arquivo apenas em momentos de não congestionamento, ou até mesmo compactar o arquivo no computador remoto antes de transferi-lo para reduzi-lo. Não há muitas soluções para este problema.
O arquivo de log de destino tem os detalhes mais recentes copiados do log de origem. Obtenha o valor da contagem de linhas do log de destino e use esse número ao ler o log de origem para ignorar esse número de linhas ao lê-lo. Anexe o que há depois dessa linha no arquivo de log de destino.
O exemplo do PowerShell abaixo usa get-content canalizado para select-object usando o
-skip
parâmetro com o valor numérico com base na contagem de linhas atuais do log de cópia e, em seguida, canaliza isso para add-content para anexar os novos dados do arquivo de log conforme sua preferência.PowerShell
Recursos de apoio
Obter conteudo
Selecionar-objeto
Adicionar conteúdo