2017-10-06 6 views
0

Je peux actuellement faire une demande à mon contrôleur de rails et j'utilise send_file pour télécharger mon fichier production.log. Le fichier est devenu énorme et j'ai rarement besoin de tout le fichier donc je voudrais télécharger seulement une partie du fichier comme les 20 dernières lignes. Existe-t-il un moyen de le faire sans lire les n dernières lignes et les écrire dans un autre fichier, puis envoyer ce fichier nouvellement créé?Télécharger 20k dernières lignes de fichier dans Rails 5

Voici le code que j'ai en ce moment:

def download_production_log 
    send_file("#{Rails.root}/log/production.log") 
end 

Répondre

1

Est-il possible de le faire sans lire les dernières lignes de n ...

Oui, vous n » t besoin de sauvegarder les n dernières lignes dans un fichier pour le servir. Vous pourriez vouloir, pour des raisons de performance, mais vous n'avez pas à.

L'astuce est: comment déterminez-vous quelles sont les n dernières lignes, sans lire le fichier entier? Ce n'est pas possible, pas sans une analyse. Si les lignes étaient de taille fixe, ce serait une autre histoire. Mais comme il est, le moyen le plus simple (à mon avis) serait d'ouvrir le fichier et de ne lire que les 64 dernières données (ou tout montant dont vous avez besoin).

Il y a un très bon changement que ce morceau de données commencera au milieu d'une ligne de journal. Il vous suffit donc de rejeter la tête de ce bloc de données jusqu'à (et y compris) le premier saut de ligne. Ce qui restera sera des lignes entières de journal. Pas exactement 20k, mais similaire (si vous calculez votre longueur moyenne de ligne de log et l'utilisez pour calculer la taille d'un bloc à lire).

Ensuite, vous pouvez utiliser les rails send_data pour envoyer ce bloc comme s'il s'agissait d'un vrai fichier.

1

Une idée consiste à exécuter tail dans votre fichier.

Je trouve qu'il y a déjà une gemme pour ça.

Vérifiez this sur.